class Singleton(type):
def __init__(self, *args, **kwargs):
print 'calling __init__ of Singleton class', self
print 'args: ', args
print 'kwargs: ', kwargs
super(Singleton, self).__init__(*args, **kwargs)
self.__instance = None
def __call__(self, *args, **kwargs):
print 'running __call__ of Singleton', self
print 'args: ', args
print 'kwargs: ', kwargs, '\n\n'
if self.__instance is None:
self.__instance = super(Singleton, self).__call__(*args, **kwargs)
return self.__instance
class A(object):
__metaclass__ = Singleton
def __init__(self,a):
print 'in __init__ of A: ', self
self.a = a
print 'self.a: ', self.a
a=A(10)
b=A(20)
このコードは、 Python の __new__ と __init__ の使用に関する質問に対する Ben の回答からコピーしたものです。と少し修正しました。でも、流れがわからない。このコードが意図していることは、より高いレベルから理解していますが。しかし、内部でどのように機能するかはよくわかりません。
このコードを実行すると、次の出力が得られます:-
calling __init__ of Singleton class <class '__main__.A'>
args: ('A', (<type 'object'>,), {'__module__': '__main__', '__metaclass__': <class '__main__.Singleton'>, '__init__': <function __init__ at 0x01F9F7B0>})
kwargs: {}
running __call__ of Singleton <class '__main__.A'>
args: (10,)
kwargs: {}
in __init__ of A: <__main__.A object at 0x01FA7A10>
self.a: 10
running __call__ of Singleton <class '__main__.A'>
args: (20,)
kwargs: {}
args
とkwargs
forがどのように異なるのか理解できませ__init__
ん__call__
。メタクラスを使用している間、このリンク ( What is a metaclass in Python?__new__
) は、関数をメタクラスとして使用する方法を説明しています。しかし、私はどのように使用されているのか分かりません__call__
。
誰か流れを説明してくれませんか? これはつまり__new__
、 、__call__
、__init__
が呼び出される優先順位と、誰が呼び出すかということです。