2017-02-21 3 views
-1

申し訳ありません。私は新しいです。なぜ、私は基本クラスを継承しているのですか? 'AttributeError'はなぜですか?

class A(object): 
    def __init__(self, idn, name): 
     self.idn = idn 
     self.name = name 


class B(object): 
    def __init__(self, idn, acc_no, criminal_case='No'): 
     self.idn = idn 
     self.acc_no = acc_no 
     self.criminal_case = criminal_case 

    def get_info(self): 
     return self.idn 

class C(A, B): 
    pass 


c = C(1, 'xyz') 
print c.get_info() 
print c.criminal_case 

トレースバック(最後の最新の呼び出し):

ファイル "tp.py"、25行、

印刷c.criminal_case

はAttributeErrorで: 'C' オブジェクトが持っているなし属性 'criminal_case'

+0

あなたは 'super'を呼び出す必要があります。しかし、あなたの継承構造はあまり意味がありません。 'B .__ init__'はどこで引数を取ると思いますか? 'C 'には2つしか渡しません。 2番目は 'name'か' acc_no'でしょうか? – BrenBarn

+0

大丈夫です!しかし、Cの中でBのinitをどのように呼び出すのですか? –

答えて

1

super()がなくても多重継承を使用することはほとんど不可能ですので、必要なのはsuper()です。

スーパー()

Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class.

あなたのコードは次のようにする必要があります:

class A(object): 
     def __init__(self, idn, name): 
      super(A, self).__init__(idn, name,'test') 
      self.idn = idn 
      self.name = name 

そして、あなたが出力を取得します:あなたは、Python 3.xでは

1 
test 

super().__init__()を使用するだけで、Pythonを使用しているようです2.xのため、super(A, self).__init__(idn, name)を使用する必要があります。

これが役に立ちます。

+0

ありがとうございますが、Bの属性 'criminal_case'にどうやってアクセスできますか? –

+0

@AmitKarnik 'super(A、self).__ init __(idn、name、 'これはcriminal_case')'とすると、出力が得られます。 – McGrady

+0

ありがとう@McGrady –

1

Pythonは継承階層のすべてのクラスに対して__init__()を呼び出しません。代わりに、単にの階層を検索して最初に__init__()を検索して実行します。コードにいくつかの印刷ステートメントを追加して、これを自分で見てください。

B.__init__Aから呼び出すには、super()に電話する必要があります。

super(A, self).__init__(idn, None) 

しかし、それは多くの意味がありません:acc_noの値がから来ることになっていますか?たぶんクラスデザインを再訪する必要があります。

関連する問題