在类上定义魔术方法

时间:2015-04-20 22:05:00

标签: python magic-methods

我想定义一个可以迭代的对象,而不必创建一个类,然后创建一个实例。像这样:

class Thing(object):
    stuff = ["foo", "bar", "baz"]

    @classmethod
    def __iter__(cls):
        return iter(cls.stuff)

for thing in Thing:
    print thing

然而,这实际上并不奏效。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

Ashwini在评论中正确提出的内容如下。这适用于Python 2。

class ThingType(type):
    __stuff__ = ["foo", "bar", "baz"]

    @classmethod
    def __iter__(cls):
        return iter(cls.__stuff__)

class Thing(object):
    __metaclass__ = ThingType

for thing in Thing:
    print thing

这适用于Python 3:

class ThingType(type):
    __stuff__ = ["foo", "bar", "baz"]

    @classmethod
    def __iter__(cls):
        return iter(cls.__stuff__)

class Thing(object, metaclass=ThingType):
    pass

for thing in Thing:
    print(thing)

答案 1 :(得分:0)

Thing实际上需要是一个类型吗?你可以使它成为一个具有类似类型的可调用行为的对象,这可能更简单:

class RealThing(object):
  pass

class ThingFactory(object):
  def __iter__(self):
    return iter(["foo", "bar", "baz"])

  def __call__(self):
    return RealThing()

Thing = ThingFactory()