【发布时间】:2012-02-25 02:32:18
【问题描述】:
我有两个无法修改的类(我们称之为 Working 和 ReturnStatement),但我想通过日志记录来扩展它们。诀窍是Working 的方法返回一个ReturnStatement 对象,所以新的MutantWorking 对象也返回ReturnStatement,除非我可以将它强制转换为MutantReturnStatement。用代码说:
# 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 中解决。除非我得到一个可行的解决方案,否则我无法接受答案,所以请编写工作代码以获得接受。
【问题讨论】:
-
"Casting" 在 Python 中不存在。
-
另外,你不应该做 "
ReturnStatement().act()" - 如果你想让其他类的 act 方法在当前对象上工作,做returnStatement.act(self)- 或者只是将它标记为一个类方法或staticmethod - 如果它不需要当前对象的实例。 -
Working.do() 返回一个 ReturnStatement。我希望 MutantWorking.do() 返回一个 MutantReturnStatement。我知道 Python 中不存在强制转换,但问题确实存在。有解决办法吗?
-
我是否覆盖 MutantReturnStatement 的 __init__() 方法来完成额外的工作并使用 ReturnStatement 返回或覆盖 MutantReturnStatement 的 act() 方法来完成 ReturnStatement 的 act() 方法的工作都没有关系.我无法到达 MutantReturnStatement,因为 Working 返回的是 ReturnStatement 而不是 MutantReturnStatement。
标签: python inheritance casting