2012-06-18 125 views
3

假設我有這個類:如何從超類方法調用子類的方法?

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(): 
     from subclassfile import MySubClass 
     MySubClass.firstFunc(self, 2, 2) 

    test() 

而這個子類中的其他文件:

from classfile import MyClass 

class MySubclass(MyClass): 
    def firstFunc(self, a, b): 
     c = a + b 
     d = self.secondFunc(self, c) 
     return d 

    def secondFunc(self, c): 
     d = c/2 
     return d 

這是一個愚蠢的例子,但代表正是我試圖做的。 我想從第一個函數內的子類中調用第二個函數。 但是,當我這樣做時,它返回一個錯誤,說MyClass沒有這樣的功能。 所以我想我不應該在函數名稱前面使用self。但是當我不這樣做時,它也會產生錯誤。

所以我的問題是: 如何在子類的第一個函數內部訪問第二個函數?

編輯:

謝謝大家的幫助。我會更好地解釋我正在嘗試做什麼,而我認爲我的實現在代碼中非常糟糕。 MyClass是代碼的主要類,其中所有的部件和主要功能都是。 此類上還有一個按鈕,它與「測試」功能綁定在一起。所以當按下按鈕時,整個事情都應該起作用。 MySubClass文件是將數據導出到某個文件的輔助模塊。 firstFunc是這個模塊中的主要功能,它處理所有的數據,而secondFunc只是建立文件的模板。所以我在firstFunc中調用了這個secondFunc,以便模板被加載,然後將數據寫入文件。 我使這個MySubClass繼承自MyClass,以便它可以直接從MyClass訪問數據庫和其他變量。

所以我想我可以做到這一點。但我對這種實現並不是很有經驗。另外,對不起我的英語不好。

+2

「這是一個愚蠢的例子,但代表了我正在嘗試做的事情」。但是,爲什麼要在超類方法中調用子類中的方法?這是毫無意義的...... – brandizzi

+0

*爲什麼*你想這樣做?正如你所描述的那樣,你真的不應該這樣做。真的*真的*不應該。請描述你想要達到的目標。幾乎肯定有一個正確的方法來實現它。 –

+0

我剛剛編輯了這個問題,以便我的目標變得更加清晰。謝謝。 –

回答

2

您不會從MyClass的實例調用此方法,您可以從MySubclass的實例調用此方法。問題是你可能得到一個TypeError,因爲你傳遞給firstFunc的參數(self)是錯誤的類型(MyClass而不是MySubClass)。解決方案是重構你的代碼,所以這不會發生。至少,我認爲這是問題(當我嘗試你的代碼時,我得到各種導入錯誤)。下面是我試過的代碼(我假設說明了您所描述的問題):

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(self): 
     return MySubClass.firstFunc(self, 2, 2) 

class MySubClass(MyClass): 
    def firstFunc(self, a, b): 
     c = a + b 
     d = self.secondFunc(c) #removed self from parameter list 
     return d 

    def secondFunc(self, c): 
     d = c/2 
     return d 


a=MyClass() 
b=MySubClass() 
print (b.test()) #this works because b is the right type to pass to first/second func 
a.test() #This doesn't work because a is the wrong type. 

注意,它並沒有真正意義的具有testMyClass的方法,因爲你不能無論如何,從那裏使用它。您可能只需將test移動到MySubClass

另外,正如其他人所指出的,self.secondfunc(self,c)也很奇怪。這基本上相當於MySubClass.secondfunc(self,self,c),它有錯誤的參數數量,因爲你傳遞了兩次self

這工作:

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(self): 
     return firstFunc(self, 2, 2) 


def firstFunc(self, a, b): 
    c = a + b 
    d = secondFunc(self,c) #self from in front of function, now in parameter list 
    return d 

def secondFunc(self, c): 
    d = c/2 
    return d 

class MySubClass(MyClass): 
    firstFunc=firstFunc 
    secondFunc=secondFunc 


a=MyClass() 
b=MySubClass() 
print (b.test()) 
print (a.test()) 

但我強烈建議重組你的代碼。

+0

謝謝你的幫助。但是,我真的需要在MyClass中調用該函數。無論如何,我無法做到這一點? –

+0

沒辦法,我能想到。爲什麼你需要在MyClass中調用該函數?您可以將firstFunc和secondFunc更改爲常規函數 - 然後您可以將這些函數作爲MySubClass上的常規方法綁定......(我將更新) – mgilson

+0

@ dex19dt - 我已更新。上面的代碼有效。 – mgilson

2

變化:

d = self.secondFunc(self, c) 

要:

d = self.secondFunc(c) 
+0

仍然有這個錯誤:「AttributeError:'MyClass'對象沒有屬性'secondFunc'」 –

1

你想打電話firstFunc,好像它是當它是一個實例方法靜態方法。您可以使用裝飾器classmethod來實現靜態方法效果。

+0

我把'@ classmethod'放在'secondFunc()'上,但它仍然會引發這個錯誤。這是你的意思,還是我做錯了? –