2012-11-25 125 views
4

我正在尋找修改一些第三方Python代碼的行爲。有很多從基類派生的類,爲了輕鬆實現我的目標,最簡單的方法就是覆蓋用於派生所有其他類的基類。有沒有簡單的方法來做到這一點,而無需觸摸任何第三方代碼?如果我沒有解釋清楚:Python:覆蓋基類

class Base(object): 
    '...' 

class One(Base) 
    '...' 

class Two(Base) 
    '...' 

...我沃爾德想進行修改,Base沒有實際修改上面的代碼。也許是這樣的:

# ...code to modify Base somehow... 

import third_party_code 

# ...my own code 

Python可能有這個問題的一些可愛的內置解決方案,但我還沒有意識到它。

+1

你心裏有什麼改變? – NPE

+0

'Base'有一些需要修改的子類使用的方法。 –

+1

應該可以在'Base.method = new_method'這樣的東西中進行猴子補丁,這將在子類的實例中正確解析。 – joeln

回答

5

也許你可以把這些方法猴子打成Base

#---- This is the third-party module ----# 

class Base(object): 
    def foo(self): 
    print 'original foo' 

class One(Base): 
    def bar(self): 
    self.foo() 

class Two(Base): 
    def bar(self): 
    self.foo() 

#---- This is your module ----# 

# Test the original 
One().bar() 
Two().bar() 

# Monkey-patch and test 
def Base_foo(self): 
    print 'monkey-patched foo' 

Base.foo = Base_foo 

One().bar() 
Two().bar() 

此打印出

original foo 
original foo 
monkey-patched foo 
monkey-patched foo