Tengo dos clases (llamémoslas Working y ReturnStatement) que no puedo modificar, pero quiero extenderlas con el registro. El truco es que el método Working devuelve un objeto ReturnStatement, por lo que el nuevo objeto MutantWorking también devuelve ReturnStatement a menos que yo pueda convertirlo a MutantReturnStatement. Diciendo con código:Cómo lanzar objetos en 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
El resultado esperado:
estoy envolviendo trabajo.
Estoy trabajando.
-
Estoy modificando ReturnStatement.
Soy un declaración de devolución.
¿Es posible resolver el problema? También tengo curiosidad si el problema también se puede resolver en PHP. A menos que obtenga una solución que funcione, no puedo aceptar la respuesta, por lo tanto, escriba el código de trabajo para que me acepten.
"Casting" no existe en Python. –
Además, no debe hacer "' ReturnStatement(). Act() '" - si desea que el método act en la otra clase funcione en el objeto actual, haga 'returnStatement.act (self)' - o simplemente márquelo como método de clase o estático: si no necesita una instancia del objeto actual. – jsbueno
Working.do() devuelve con un ReturnStatement. Quiero que MutantWorking.do() vuelva con un MutantReturnStatement. Sé que el casting no existe en Python, pero el problema sí. ¿Hay una solución? – Visko