メソッドcls
に渡される属性はクラス()への参照ですが、そのサブクラスをサブクラス化してインスタンス化した場合は、代わりにサブクラスへの参照になります。__new__
Singleton
cls == Singleton
Singleton
cls
super
Singleton
現在のクラス( )と、クラス階層内の次のクラスを計算するためにクラス階層がトラバースするサブクラス()の両方を知る必要がありますが、サブクラスがないcls
ため、これらは常に同じです。Singleton
渡す必要がある理由を詳しく説明するためにcls
、これらのクラスすべてに、スーパーメソッドを呼び出して結果を返す単純なパススルー__new__
メソッドがあると仮定します。
class A(object): pass
class B(object): pass
class C(A, B): pass
次に、をC.__new__
呼び出しますsuper(C, cls).__new__
。これは。と同等A.__new__
です。ここで、ではなく、super(A, cls).__new__
と同等になりたいと考えています。しかし、それを見つける唯一の方法は、開始がでではなく、であったと言われることです。B.__new__
object.__new__
super
C
A
あなたの場合、唯一のスーパークラスはobject
、orig.__new__
と同等であり、インスタンス化するクラスを認識できるようにobject.__new__
渡されます。cls