我有兩個類(讓我們稱它們爲Working和ReturnStatement),我不能修改,但我想用logging來擴展它們。技巧是Working的方法返回一個ReturnStatement對象,所以新的MutantWorking對象也會返回ReturnStatement,除非我可以將它轉換爲MutantReturnStatement。與代碼話說:如何在Python中投射物體
# these classes can't be changed
class ReturnStatement(object):
def act(self):
print "I'm a ReturnStatement."
class Working(object):
def do(self):
print "I am Working."
return ReturnStatement()
# these classes should wrap the original ones
class MutantReturnStatement(ReturnStatement):
def act(self):
print "I'm wrapping ReturnStatement."
return ReturnStatement().act()
class MutantWorking(Working):
def do(self):
print "I am wrapping Working."
# !!! this is not working, I'd need that casting working !!!
return (MutantReturnStatement) Working().do()
rs = MutantWorking().do() #I can use MutantWorking just like Working
print "--" # just to separate output
rs.act() #this must be MutantReturnState.act(), I need the overloaded method
預期的結果:
我包裝工作。
我工作。
-
我在包裝ReturnStatement。
我是ReturnStatement。
是否可以解決問題?我也很好奇這個問題是否也可以在PHP中解決。除非我得到一個工作解決方案,否則我不能接受答案,所以請寫下工作代碼以便接受。
「鑄造」在Python中不存在。 – 2012-02-02 12:38:26
另外,你不應該這樣做''ReturnStatement()。act()'「 - 如果你想讓act方法在其他類上工作在當前對象上,可以執行'returnStatement.act(self)' - 或者標記它作爲類方法或靜態方法 - 如果它不需要當前對象的實例。 – jsbueno 2012-02-02 12:41:59
Working.do()返回一個ReturnStatement。我想讓MutantWorking.do()返回一個MutantReturnStatement。我知道在Python中不存在轉換,但是問題確實存在。有解決方案嗎? – Visko 2012-02-02 12:43:44