5
In [5]: class a(object):
   ...:     def __init__(self):
   ...:         print "In class a"
   ...:         self.a = 1
   ...:         
In [6]: class b(object):
   ...:     def __init__(self):
   ...:         print "In class b"
   ...:         self.b = 2
   ...:         
   ...:         

In [7]: class c(b, a):
   ...:     pass
   ...: 
In [8]: c.mro()
Out[8]: 
[<class '__main__.c'>,
 <class '__main__.b'>,
 <class '__main__.a'>,
 <type 'object'>]

In [9]: obj = c()
In class b

In [10]: obj.__dict__
Out[10]: {'b': 2}

クラスのデフォルト__init__メソッドは作成時にc呼び出されobj、内部的には__init__クラスのみを呼び出しますb

私の理解によると、2つのクラスから継承する場合、派生クラスオブジェクトには両方のクラスの変数が含まれている必要があります(これらのクラスにプライベートでない場合)。

私の質問:派生オブジェクトに両方のクラスの変数が含まれていると期待するのは間違っていますか?もしそうなら、なぜですか?__init__クラスのaも呼ばれるべきではありませんか?C ++のような言語では何が起こっただろうか?

4

1 に答える 1

8

Pythonでは、デフォルトでは上位クラスの初期化メソッドは呼び出されません。これを行うには、次のようにsuperを使用して明示的に呼び出す必要があります。

class a(object):
    def __init__(self):
        super(a, self).__init__()
        print "In class a"
        self.a = 1

class b(object):
    def __init__(self):
        super(b, self).__init__()
        print "In class b"
        self.b = 2

class c(b, a):
    pass

obj = c()

出力例。

クラスaで
クラスbで

編集:これがこのように機能する理由については、Pythonの禅に基づいた設計上の決定だと思います:

明示的は暗黙的よりも優れています。

于 2012-02-13T07:21:14.693 に答える