2016-04-24 81 views
-2

說我有兩個文件,file1.pyfile2.py。在file1.py,我定義了兩個班,一個從其他繼承:在另一個文件中覆蓋類的方法

file1.py:

class Class1: 
    def __init__(self): 
     pass 

    def func1(self): 
     return "Hello world!" 

class Class2(Class1): 
    def __init__(self): 
     pass 

    def func2(self): 
     return self.func1() 

所以我現在能夠調用func1()func2()Class2

file2.py:

​​

問題:我怎樣才能在file2.py改變func1()Class1,使func2()Class2回報一樣func1()

所以不喜歡這樣的:

class Class3(file1.Class2): 
    ... 
    def func1(self): 
     return "Another string" 
+2

這並不完全清楚你想要什麼,但是如果僅僅覆蓋'Class3.func2()'不是解決方案,它聽起來像'Class3'不應該從'Class2'繼承。 – chepner

+0

@chepner這有點棘手,以上只是Python標準庫中的一個類的框架(在file1.py中定義)。 file2.py是我自己的文件,我不想更改站點包中的文件中的代碼! – linusg

回答

1

會覆蓋func1工作?

class Class(file1.Class2): 
    def func1(self): 
     print "Class3.func1" 

c = Class3() 
c.func2() 

由於func2Class3沒有定義,Class2.func2被調用。但是,在該函數的主體中,self仍然是Class3的一個實例,因此self.func1()調用Class3.func1,而不是Class1.func1。這是從

d = Class2() 
d.func2() 

其中selfClass2.func2Class2實例不同。 Class2未定義func1,因此調用Class1.func1

+0

嘿,非常感謝,很有效!我沒有想過,但是'func1()'沒有在'Class3'中定義,這似乎是一個很好的解決方案。我用它來覆蓋從我的類中的'ftplib'模塊中的'FTP'類的函數,它繼承自從'FTP'繼承的'FTP_TLS' ... :) – linusg

0

我想你想monkeypatch Class1.func1

c2 = Class2() 
print(c2.func2()) 
Hello world! 

def new_func1(self): 
    return "Another string" 

Class1.func1 = new_func1 # This is monkey patching. 

print(c2.func2()) 
Another string 

但是,這可能會中斷使用Class1Class2其他代碼。

+0

這會修改所有具有'Class1類的行爲'作爲祖先,不僅僅是'Class3'。 – chepner

+0

謝謝,但我不能讓這個工作與ftplib類... – linusg

+0

@chepner我知道,因此「這可能會打破東西」位。在我看來,這正是OP所要求的:「我怎樣才能從file2.py中的Class1更改func1()......」但正如你所說的,它並不完全清楚他們想要什麼。 – Goyo