Как выполнить цикл над переменными экземпляра класса без вызова методов?

#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 атрибуте. Если нет, я не вижу, стоит ли прилагать усилия: просто жестко запрограммируйте серию вызовов print , по одному на атрибут.

Ответ №1:

Все функции могут быть вызваны. Итак, вам просто нужно их отфильтровать:

 def info(self):
    print('n'.join("%s: %s" % item 
                    for item in vars(self).items()
                    if not hasattr(item, '__call__')
         ))
  

При этом будут выводиться только не вызываемые атрибуты класса.

Комментарии:

1. Спасибо, это именно то, что я искал.