2016-10-02 49 views
-1

可能我來的情況是,從B級稱爲A類的方法下面的程序是如何在python

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

    def abc(self): 
     print self.a 

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

def method1(): 
    a = A(2) 

method1() 
b = B() 

Expecting Output: 2 

是否有可能從B級不斷變化的調用方法「ABC」類A,並且不應該在類B中創建類A對象。如果是,請讓我知道解決方案。

我試過的上面的程序出錯了。

而且我得到的錯誤是低於

Traceback (most recent call last): 
    File "a.py", line 12, in <module> 
     b = B() 
    File "a.py", line 10, in __init__ 
     super(B, self).abc() 
File "a.py", line 6, in abc 
    print self.a 
AttributeError: 'B' object has no attribute 'a' 
+8

你期望這個打印,考慮了''未初始化什麼嗎? – Karin

+1

'self.a'在'A'的__init __()'函數中定義。由於您在'B'中覆蓋'__init __()','self.a'沒有在'B'中定義。 – MattDMo

+1

您需要調用'super(A,self).__ init __(...)'以確保所有屬性都設置正確。 – jonrsharpe

回答

2

您的B級__init__方法不採取任何參數,而A類的__init__需要你傳遞一個(命名爲「A」),然而,你沒有提供它。無論是在B班還是通過將它傳遞給A.

但是,這會起作用。

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

    def abc(self): 
     print self.a 

class B(A): 
    def __init__(self): 
     self.a = 10 
     super(B, self).abc() 

或者:

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

inst = B() 
inst.abc() # 10 
0

這裏:

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

A構造函數永遠不會被調用,所以在做A.__init__初始化丟失。它在print self.a失敗,因爲沒有a。 應該調用超級構造函數。另外,super(B, self).abc()self.abc()相同。

如果有一個名爲方法abcB定義,那麼self.abc()將從B調用該方法,而super(B, self).abc()將調用來自超類中的方法。

所以,因爲這些都是一樣的,我不會使用醜陋的。它只是使代碼不易讀。

有了這兩個補丁:

class B(A): 
    def __init__(self): 
     super(B, self).__init__(1000) # whatever default value 
     self.abc()