Mam dwie klasy (nazwijmy je Working and ReturnStatement), których nie mogę zmodyfikować, ale chcę rozszerzyć obie z logowaniem. Sztuczka polega na tym, że metoda Working zwraca obiekt ReturnStatement, więc nowy obiekt MutantWorking zwraca również ReturnStatement, chyba że mogę go przesłać do MutantReturnStatement. Mówiąc o kodzie:Jak rzutować obiekt w Pythonie
# 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
Oczekiwany wynik:
ja owijania roboczych.
Pracuję.
-
Zawijam ReturnStatement.
Jestem raportem zwrotnym.
Czy można rozwiązać problem? Jestem także ciekawy, czy problem można rozwiązać również w PHP. Dopóki nie otrzymam działającego rozwiązania, nie mogę zaakceptować odpowiedzi, więc proszę napisać działający kod, aby uzyskać akceptację.
"Przesyłanie" nie istnieje w języku Python. –
Nie powinieneś też robić "' ReturnStatement(). Act() '" - jeśli chcesz, aby metoda aktowania była inna klasa do pracy na bieżącym obiekcie, wykonaj 'returnStatement.act (self)' - lub po prostu zaznacz to jako metoda klasy lub metoda statyczna - jeśli nie potrzebuje instancji bieżącego obiektu. – jsbueno
Funkcja Working.do() zwraca wartość ReturnStatement. Chcę, aby MutantWorking.do() powrócił z MutantReturnStatement. Wiem, że casting nie istnieje w Pythonie, ale problem występuje. Czy istnieje rozwiązanie? – Visko