我继承了一个项目,其中包含许多大类,只有类对象(整数,字符串等).我希望能够检查属性是否存在而无需手动定义属性列表.
是否可以使用标准语法使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] != "__"])
Run Code Online (Sandbox Code Playgroud)
但是,这并不能完全满足我的需求:
Run Code Online (Sandbox Code Playgroud)>>> for x in Foo: ... print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classobj' object is not iterable
即便如此,这仍然有效:
Run Code Online (Sandbox Code Playgroud)>>> for x in Foo.__iter__(): ... print(x) bar baz
我正在做一个项目,我想让我的一个类可迭代。据我所知,我可以使用元类来做到这一点。
首先,我想了解元类是如何工作的。因此,我想展示我自己的练习示例,其中我制作了 Car 课程。所以在这里我想让我的 Car 类对象可迭代,然后我想在主函数中打印它们的名称。
代码示例如下:
__author__ = 'mirind4'
class IterableCar(type):
def __iter__(self):
return iter(self.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
Run Code Online (Sandbox Code Playgroud)
但不幸的是我得到了一个类型错误:
TypeError: 'type' object is not iterable
Run Code Online (Sandbox Code Playgroud)
你能不能告诉我我的代码哪里出错了?到目前为止,我已经通过这个网站和互联网检查了类似的问题,但我不知道问题是什么。我正在使用 python 3.4。提前致谢!