Search code examples
pythonmagic-methods

Defining magic methods on classes


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?


Solution

  • 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)