2011-10-02 4 views
15

A:パイソン:スーパーと__init __()対__init __(自己)

super(BasicElement, self).__init__() 

B:

super(BasicElement, self).__init__(self) 

AとBの違いは何ですか?私が使っているほとんどの例はAを使っていますが、Aは親の__init__関数を呼び出していないが、Bは問題になっています。これはなぜでしょうか?どちらを使うべきですか?

+1

'B'が動作するコードを表示します。 「「A」は呼んでいない」とはどういう意味ですか?間違いはありますか?何が起こるのですか? 'A .__ init__'は' self'以外のパラメータをとりますか? – agf

答えて

23

何らかの形でBasicElementクラスの__init__が引数を取らない限り、この2番目のフォームを実行する必要はありません。

class A(object): 
    def __init__(self): 
     print "Inside class A init" 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     print "Inside class B init" 

>>> b = B() 
Inside class A init 
Inside class B init 

またはinitの引数を必要とするクラスを持つ:

class A(object): 
    def __init__(self, arg): 
     print "Inside class A init. arg =", arg 

class B(A): 
    def __init__(self): 
     super(B, self).__init__("foo") 
     print "Inside class B init" 

>>> b = B() 
Inside class A init. arg = foo 
Inside class B init  
+5

この構成の重要な点は、スーパークラスAをオブジェクトから明示的に派生させる必要があることです。 'class A:'を宣言するだけで、スーパーinit呼び出しが呼び出されたときに 'TypeError:型であり、classobjではない'という例外が発生します。 – parvus

+0

クラスAはオブジェクトから派生する必要があります!!!!クラスAはオブジェクトから派生する必要があります!!!!クラスAはオブジェクトから派生する必要があります!!!!通知のために3回繰り返します。 – bourneli

関連する問題