Kürzlich las ich an interesting discussion on how to make a singleton in Python. Eine der Lösungen war ein tricky decorator defining a class inside its code as a substitute for decorated class:Warum passiert hier eine Rekursion?
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)
Ausgang ist:
111 # the __init__ is called only on the 1st time
MyClass # the __name__ is preserved
True # this is actually the same instance
Es angegeben ist, dass, wenn wir super(MyClass, self).__init__(text)
innerhalb __init__
von MyClass
verwenden wir in Rekursion bekommen.
Ich habe getestet und in der Tat die Rekursion passiert. Aber, wie ich sie verstehe, MyClass
erbt object
, nur super(MyClass, self)
sollte so einfach object
sein, aber es stellt sich heraus, dass super(MyClass, self)
ist __main__.MyClass
Können Sie uns erklären, was für Schritt hier Schritt geschieht für mich, die Gründe zu verstehen, warum die Rekursion geschieht ?
Super() ist ein bisschen schwierig mit Python, überprüfen http://rhettinger.wordpress.com/2011/05/26/super-considered-super/ – Lycha