我正在做一个项目,我想让我的一个类可迭代。据我所知,我可以使用元类来做到这一点。
首先,我想了解元类是如何工作的。因此,我想展示我自己的练习示例,其中我制作了 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。提前致谢!
据我所知,通过使用元类使类对象可迭代效果很好:
from __future__ import print_function
class IterableCar(type):
def __iter__(cls):
return iter(cls.__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)
Run Code Online (Sandbox Code Playgroud)
结果是:
mgilson$ python ~/sandbox/test.py
C
a
r
Run Code Online (Sandbox Code Playgroud)
这是我实际跟踪生成的汽车的示例:
from __future__ import print_function
import weakref
class IterableCar(type):
_cars = weakref.WeakSet()
def __iter__(cls):
return iter(cls._cars)
def add_car(cls, car):
cls._cars.add(car)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.__class__.add_car(self)
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)
请注意,如果您使用的是 python3.x,要使用元类,您需要执行以下操作:
class Car(metaclass=IterableCar):
...
Run Code Online (Sandbox Code Playgroud)
而不是:
class Car(object):
__metaclass__ = IterableCar
Run Code Online (Sandbox Code Playgroud)
这可能可以解释您遇到的问题。
| 归档时间: |
|
| 查看次数: |
55769 次 |
| 最近记录: |