Почему здесь происходит рекурсия?

Недавно я прочитал интересное обсуждение того, как сделать синглтон в Python . Одним из решений был хитрый декоратор, определяющий класс внутри своего кода в качестве замены декорированного класса:

def singleton(class_):
    class class_w(class_):
        _instance = None
        def __new__(class2, *args, **kwargs):
            if class_w._instance is None:
                class_w._instance = super(class_w, class2).__new__(class2, *args, **kwargs)
                class_w._instance._sealed = False
            return class_w._instance
        def __init__(self, *args, **kwargs):
            if self._sealed:
                return
            super(class_w, self).__init__(*args, **kwargs)
            self._sealed = True
    class_w.__name__ = class_.__name__
    return class_w

@singleton
class MyClass(object):
    def __init__(self, text):
        print text
    @classmethod
    def name(class_):
        print class_.__name__

x = MyClass(111)
x.name()
y = MyClass(222)
print id(x) == id(y)

Выход:

111     # the __init__ is called only on the 1st time
MyClass # the __name__ is preserved
True    # this is actually the same instance

Утверждается, что если мы используем super(MyClass, self).__init__(text)внутри __init__из MyClass, мы попадаем в рекурсию .

Я проверил, и действительно рекурсия происходит. Но, насколько я понимаю, MyClassнаследует object, поэтому super(MyClass, self)должно быть просто object, а получается, что super(MyClass, self)есть__main__.MyClass

Не могли бы вы объяснить, что здесь происходит, шаг за шагом, чтобы я понял причины, по которым происходит рекурсия?

6
задан Community 23 May 2017 в 12:21
поделиться