类型错误:“类型”对象不可迭代 - 迭代对象实例

mir*_*nd4 7 python iterable

我正在做一个项目,我想让我的一个类可迭代。据我所知,我可以使用元类来做到这一点。

首先,我想了解元类是如何工作的。因此,我想展示我自己的练习示例,其中我制作了 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。提前致谢!

mgi*_*son 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)

这可能可以解释您遇到的问题。

  • @mirind4 - 如果您在类级别保留实例列表,则每次创建的每个实例都会有一个引用。因此,引用计数永远不会降至 0,因此该对象将永远无法被垃圾回收。这可能是您想要的行为。使用“WeakSet”,当对象超出范围时,它将被垃圾收集,并且类将停止跟踪它。 (2认同)