最近、Pythonでシングルトンを作成する方法に関する興味深い議論を読みました。解決策の1つは、装飾されたクラスの代わりにコード内のクラスを定義するトリッキーなデコレータでした。
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
再帰が発生する理由を理解するために、ここで何が起こっているのかを段階的に説明していただけますか?