#python #class
#python #класс
Вопрос:
В следующем примере кода я пытаюсь распечатать список всех переменных экземпляра, вызывая info()
метод моего класса. Пока это работает, но проблема в том, что также вызывается перебор переменных экземпляра setup_method()
и self.update_state()
, потому что они, похоже, также являются переменными класса.
Есть ли элегантный способ предотвратить это?
import setup_method
import read_state
class Relay(object):
"""Simple class for a Relay"""
def __init__(self, name, channel):
self.name = name
self.channel = channel
self.state = None
setup_method()
self.update_state()
def switch_low(self):
print('low')
self.update_state()
def switch_high(self):
print('high')
self.update_state()
def update_state(self):
self.state = read_state()
def info(self):
print('n'.join("%s: %s" % item for item in vars(self).items()))
if __name__ == '__main__':
relay_a = Relay('Generic Relay', channel=0)
relay_a.info()
Комментарии:
1. Подумайте об использовании
__dict__
.2. @ZavenZareyan
vars(obj)
обычно возвращаетobj.__dict__
3.Если вы планируете обновлять набор атрибутов экземпляра так часто, что чувствуете необходимость автоматизировать определение
info
подобным образом, рассмотрите возможность сохранения значений в одном явномdict
атрибуте. Если нет, я не вижу, стоит ли прилагать усилия: просто жестко запрограммируйте серию вызовов
Ответ №1:
Все функции могут быть вызваны. Итак, вам просто нужно их отфильтровать:
def info(self):
print('n'.join("%s: %s" % item
for item in vars(self).items()
if not hasattr(item, '__call__')
))
При этом будут выводиться только не вызываемые атрибуты класса.
Комментарии:
1. Спасибо, это именно то, что я искал.