我继承了一个项目,其中包含许多大类,只有类对象(整数,字符串等).我希望能够检查属性是否存在而无需手动定义属性列表.
是否可以使用标准语法使python类本身可迭代?也就是说,我希望能够在Foo中使用attr来迭代所有类的属性:(或者甚至在Foo中使用attr),而无需首先创建类的实例.我想我可以通过定义__iter__来做到这一点,但到目前为止我还没有完全管理我正在寻找的东西.
通过添加__iter__方法,我已经实现了我想要的一些东西:
class Foo:
bar = "bar"
baz = 1
@staticmethod
def __iter__():
return iter([attr for attr in dir(Foo) if attr[:2] != "__"])
但是,这并不能完全满足我的需求:
06001
即便如此,这仍然有效:
06002
解决方法:
将__iter__添加到元类而不是类本身(假设Python 2.x):
class Foo(object):
bar = "bar"
baz = 1
class __metaclass__(type):
def __iter__(self):
for attr in dir(self):
if not attr.startswith("__"):
yield attr
对于Python 3.x,请使用
class MetaFoo(type):
def __iter__(self):
for attr in dir(self):
if not attr.startswith("__"):
yield attr
class Foo(metaclass=MetaFoo):
bar = "bar"
baz = 1