Я унаследовал проект с множеством больших классов, состоящих только из объектов классов (целых чисел, строк и т. Д.). Я хотел бы иметь возможность проверить наличие атрибута без необходимости вручную определять список атрибутов.
Можно ли сделать Python class сам итеративным, используя стандартный синтаксис? То есть я хотел бы иметь возможность перебирать все атрибуты класса, используя for attr in Foo:
(или даже if attr in Foo
), без необходимости сначала создавать экземпляр класса. Я думаю, что могу сделать это, определив __iter__
, но до сих пор я не совсем справился с тем, что ищу.
Я добился того, чего хотел, добавив __iter__
метод, подобный следующему:
class Foo:
bar = "bar"
baz = 1
@staticmethod
def __iter__():
return iter([attr for attr in dir(Foo) if attr[:2] != "__"])
Однако, это не совсем то, что я ищу:
>>> for x in Foo:
... print(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'classobj' object is not iterable
Несмотря на это, это работает:
>>> for x in Foo.__iter__():
... print(x)
bar
baz