Я унаследовал проект со многими большими классами, состоящими только из объектов класса (целые числа, строки и т.д.). Я хотел бы иметь возможность проверить наличие атрибута без необходимости определять список атрибутов вручную.
Можно ли сделать 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
hasattr
а>. Вам не нужно делать свой класс итерабельным. - person user2357112 supports Monica   schedule 24.05.2020