私は変更できない2つのクラス(WorkingとReturnStatementと呼ぶ)を持っていますが、両方をロギングで拡張したいと思います。トリックは、WorkingのメソッドがReturnStatementオブジェクトを返すので、新しいMutantWorkingオブジェクトはMutantReturnStatementにキャストできない限り、ReturnStatementも返します。コードと言う: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では存在しません。 –
また、 "ReturnStatement()。act()' "を実行すべきではありません。 - 他のクラスが現在のオブジェクトで動作する必要がある場合は、' returnStatement.act(self) 'を実行するか、現在のオブジェクトのインスタンスを必要としない場合は、classmethodまたはstaticmethodとして宣言します。 – jsbueno
Working.do()は、ReturnStatementを返します。私はMutantWorking.do()がMutantReturnStatementを返すようにします。私はキャストがPythonでは存在しないことを知っていますが、問題はあります。解決策はありますか? – Visko