我已經繼承了一個項目,其中包含許多大類,除了類對象(整數,字符串等)之外沒有其他任何東西。我希望能夠檢查一個屬性是否存在,而無需手動定義屬性列表。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