2
class Singleton(object):
  def __new__(cls, *args, **kw):
      if not hasattr(cls, '_instance'):
        orig = super(Singleton, cls)
        cls._instance = orig.__new__(cls, *args, **kw)
      return cls._instance

誰かがここで何が起こるかについて詳細な説明を与えることができますか >> super(Singleton, cls) for cls 引数が渡されますか?

4

1 に答える 1

3

メソッドclsに渡される属性はクラス()への参照ですが、そのサブクラスをサブクラス化してインスタンス化した場合は、代わりにサブクラスへの参照になります。__new__Singletoncls == SingletonSingletoncls

superSingleton現在のクラス( )と、クラス階層内の次のクラスを計算するためにクラス階層がトラバースするサブクラス()の両方を知る必要がありますが、サブクラスがない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__superCA

あなたの場合、唯一のスーパークラスはobjectorig.__new__と同等であり、インスタンス化するクラスを認識できるようにobject.__new__渡されます。cls

于 2013-03-20T11:53:48.577 に答える