Определение магических методов на занятиях

Я хотел бы определить один объект, который можно повторять без создания класса, а затем экземпляра. Что-то вроде этого:

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

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

for thing in Thing:
    print thing

Однако это на самом деле не работает. Есть какой-либо способ сделать это?

2 ответа

Решение

Ашвини правильно предложил в своем комментарии следующее. Это работает в 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)

Есть ли Thing на самом деле нужно быть типом? Вы могли бы сделать его объектом с типом вызываемого поведения, что, вероятно, было бы проще:

class RealThing(object):
  pass

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

  def __call__(self):
    return RealThing()

Thing = ThingFactory()
Другие вопросы по тегам