Определение магических методов на занятиях
Я хотел бы определить один объект, который можно повторять без создания класса, а затем экземпляра. Что-то вроде этого:
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()