我已经继承了一个项目,其中包含许多大类,除了类对象(整数,字符串等)之外没有其他任何东西。我希望能够检查一个属性是否存在,而无需手动定义属性列表。Python:是否有可能使用标准语法创建一个类可迭代?
是否有可能使python 类使用标准语法自己迭代?也就是说,我希望能够使用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
不错。请你能解释为什么OP的方法不起作用?谢谢。 – NPE 2011-03-25 15:25:21
@aix:OP的方法不起作用的原因是'__iter__'方法仅适用于类的*实例*。这会将'__iter__'方法碰到元类的实例,即类。 – nmichaels 2011-03-25 15:41:56
@nmichaels这很有道理,谢谢你的解释。 – NPE 2011-03-25 15:42:55