I would like to define a single object that can be iterated over without having to create a class and then an instance. Something like this:
class Thing(object):
stuff = ["foo", "bar", "baz"]
@classmethod
def __iter__(cls):
return iter(cls.stuff)
for thing in Thing:
print thing
However this doesn't actually work. Is there any way to do this?
What Ashwini correctly suggested in his comment is the following. This works in 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
And this works in 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)
Does Thing
actually need to be a type? You could make it an object that has type-like callable behavior, which would probably be simpler:
class RealThing(object):
pass
class ThingFactory(object):
def __iter__(self):
return iter(["foo", "bar", "baz"])
def __call__(self):
return RealThing()
Thing = ThingFactory()