Wie cast-Objekt in Python

Ich habe zwei Klassen (nennen wir Sie Arbeiten und ReturnStatement), die ich nicht ändern kann, aber ich will verlängern, beide mit Protokollierung. Der trick ist, dass die Arbeiten, die Methode gibt ein ReturnStatement-Objekt, so werden die neuen MutantWorking Objekt gibt auch ReturnStatement es sei denn, ich werfe es MutantReturnStatement. Der Spruch mit code:

# 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

Das erwartete Ergebnis:
Ich bin das einwickeln der Arbeit.
Ich bin Arbeiten.
--
Ich bin Umhüllung ReturnStatement.
Ich bin ein ReturnStatement.

Ist es möglich, das problem zu lösen? Ich bin auch gespannt, ob das problem gelöst werden kann, in PHP, auch. Es sei denn, ich bekomme eine funktionierende Lösung, die ich nicht akzeptieren kann, dass die Antwort, so schreiben Sie bitte funktionierenden code zu bekommen, akzeptiert.

"Casting" existiert nicht in Python.
Auch sollten Sie es nicht tun "ReturnStatement().act()" - wenn Sie möchten, dass die act-Methode ont er anderen Klasse zu arbeiten, um auf das aktuelle Objekt, tun returnStatement.act(self) - oder markieren Sie es als eine classmethod oder staticmethod - wenn es es nicht nötig, eine Instanz des aktuellen Objektes.
Arbeiten.do() kehrt mit einem ReturnStatement. Ich will MutantWorking.tun Sie (), um mit einem MutantReturnStatement. Ich kenne Gießen nicht vorhanden, in Python, aber das problem macht. Gibt es eine Lösung?
Es spielt keine Rolle, ob ich überschreiben MutantReturnStatement die __init__ () - Methode zu tun, die zusätzliche Arbeit und zurück mit einem ReturnStatement oder überschreiben Sie die MutantReturnStatement die act () - Methode, um den job tun, von dem ReturnStatement die act () - Methode. Ich kann Sie nicht erreichen die MutantReturnStatement, weil die Arbeit zurück mit ReturnStatement und nicht mit einem MutantReturnStatement.

InformationsquelleAutor Visko | 2012-02-02

Schreibe einen Kommentar