27

私が今学んだこととして、私はsuper()このように使うことができます:
super(class, obj_of_class-or-_subclass_of_class)

コードは以下のとおりです。

#Case 1
class A(object):
    def __init__(self):
        print "A init"

class B(A):
    def __init__(self):
        print "B init"
        super(B, self).__init__()  #ok, I can invoke A's __init__ successfully

#Case 2
class A(object):
    @classmethod
    def foo(cls):
        print "A foo"

class B(object):
    @classmethod
    def foo(cls):
        print "B foo"
        super(B, cls).foo()   #ok, I can invoke A's foo successfully

#Case 3
class A(object):
    def __new__(cls):
      print "A new"
      return super(A, cls).__new__(cls)

class B(A):
    def __new__(cls):
      print "B new"
      return super(B, cls).__new__()  #Oops, error

質問:

ケース1と2の場合、objまたはclsを指定せずにスーパーを正常に使用できます。しかし、なぜ私は同じことをすることができないの__new__ですか?なぜなら、ケース3の場合、そのようにスーパーを使用すると、エラーが発生したからです。しかし、私がそれをこのように使用する場合:

super(B, cls).__new__(cls)

エラーはありません。

4

1 に答える 1

34

メソッドのオーバーライドに関するPythonリリースノートから__new__

__new__静的メソッドであり、クラスメソッドではありません。最初はクラスメソッドでなければならないと思っていたので、classmethodプリミティブを追加しました。残念ながら、クラスメソッドでは、この場合、アップコールは正しく機能しないため、最初の引数として明示的なクラスを使用する静的メソッドにする必要がありました。

は静的メソッドなので__new__、静的メソッドをsuper(...).__new__返します。clsこの場合、最初の引数へのバインドはありません。すべての引数は明示的に指定する必要があります。

于 2011-09-19T13:09:47.160 に答える