【发布时间】:2018-08-31 08:13:00
【问题描述】:
我继承了一个项目,其中包含许多仅由类对象(整数、字符串等)构成的大型类。我希望能够检查是否存在属性,而无需手动定义属性列表。
是否可以使用标准语法使 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。你不需要让你的类可迭代。
标签: python syntax attributes static-methods loops