2017-02-21 102 views
-1

對不起,我是oop的新手。當我繼承基類時,爲什麼會出現'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'。第二個應該是'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 

,你會得到輸出:

1 
test 

在Python 3.x的你可以只使用super().__init__(),而且你似乎在使用Python 2.x,所以你需要使用super(A, self).__init__(idn, name)

希望這會有所幫助。

+0

謝謝,但我如何訪問B的屬性'criminal_case'? –

+0

@AmitKarnik'super(A,self).__ init __(idn,name,'this是criminal_case')',你會得到輸出。 – McGrady

+0

謝謝@McGrady –

1

對於繼承層次結構中的每個類,Python不會調用__init__()。相反,它只是搜索第一個__init__()的層次結構並運行它。將一些打印語句添加到代碼中以便自己查看。

要從A調用B.__init__,您需要自行撥打super()

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

但是,這並不讓有很大的意義:這裏是爲acc_no的價值從何而來?也許你應該重新審視你的課堂設計。

相關問題