1.__new__(cls, *args, **kwargs) はオブジェクトの作成時に呼び出され、現在のオブジェクトのインスタンスを返します。注意: ここでの最初のパラメーターは cls であり、これはクラス自体です
2. __init__(self, *args, **kwargs) オブジェクトの作成後に呼び出され、現在のオブジェクトのインスタンスが初期化されます。戻り値はありません。つまり、__new__ を呼び出した後、返されたインスタンスに従って初期化されることに注意してください。ここでの最初のパラメータは self です。つまり、オブジェクト自体です [new との違いに注意してください]
3.__call__(self, *args, **kwargs) クラスがこのメソッドを実装している場合、このタイプのオブジェクトを使用するのと同等です関数として使用します。これはオーバーロードと同等です。括弧演算子
具体的な例を見てください:
def __init__(self, *args, **kwargs):
print "init"
super(O, self).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
print "new", cls
return super(O, cls).__new__(cls, *args, **kwargs)
def __call__(self, *args, **kwargs):
print "call"
oo = O()
print "________"
oo()
__init__ メソッドをオーバーロードできますか?明らかに不可能です。__init__ が以前に __new__ メソッドを呼び出しており、この時点でオブジェクトが生成されているため、シングルトン モードを実装する方法はありません