2

これについてはこれまで何度も議論されてきたことは知っていますが、「ボンネットの下」で何が起こっているのかについての説明はありませんでした。

コードの最後の行にコメントを入れるとエラーが発生する理由について、詳細な説明を提供できる人はいますか? その object.__init__ が引数を取らないことは知っていますが、行がコメントアウトされているときにコードが機能するのはなぜですか?

class A:
   def __init__(self, a):
      print("A constructor")
      super().__init__(a)
      self.a = a
      print("A constructor end")

class B:
   def __init__(self, b):
      print("B constructor")
      super().__init__()
      self.b = b
      print("B constructor end")


class C(A, B):
   def __init__(self, x):
      super().__init__(x)


c = C(42)
#a = A(33)
4

1 に答える 1

6

Python 3 では、すべてのメソッドは、定義されている「現在のクラス」に隠し値が追加されたクロージャーになります。これはsuper()(引数なしで) によってアクセスされます。

Super は、クラスのメソッド解決順序 (MRO) を使用するオブジェクトを返します。C インスタンスの場合、これは A の後に B を持ちます。

MRO で B を見つけないとsuper().__init__、A で object.__init__ が呼び出されますが、これにはパラメーターを渡すことはできません。

SomeClass.__mro__ を見ると、クラスの MRO を表示できます。

主に 2.x について話していますが、 http://fuhm.net/super-harmful/を読みたいと思うかもしれません。

于 2010-01-13T21:45:34.013 に答える