Vererbte funktion ändern ohne sie zu überschreiben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Hallo,


wie im Titel beschrieben, suche ich eine Methode um eine Funktion einer Klasse, etwas abzuändern, ohne diese gänzlich und komplett überschreiben zu müssen.

Um Klartext zu reden, will ich am anfang oder am ende der Funktion noch vorher eine andere Funktion ausführen lassen.

Gibts da eine Möglichkeit in Python so eine Art hook & inject vorzunehmen?

Edit: Hier ein kleiner schnipsel Pseudocode, der hoffentlich meine Problematik erklärt:

Code: Alles auswählen

class A():
    def func_a(self):
        print 'Ich bin eine Funktion'
        
        
class B(A):
    def func_b(self):
        print 'Ich soll vor func_a ausgeführt werden!!'

B().func_a()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

class B(A):
    def func_a(self):
        print 'Ich soll vor func_a ausgeführt werden!!'
        A.func_a(self)
?
Das Leben ist wie ein Tennisball.
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

damit würdest du die funktion komplett überschreiben, was nicht mein ziel ist, da eben alle (benötigten) parameter usw. ebenso durch die neue funktion überschrieben werden. Daher will ich dass die grundfunktion mit allen benötigten parametern gleich bleibt, nur soll eben diese (in diesemfall parameterlose) funktion vorher automatisch ausgeführt werden.
BlackJack

@Brainsucker: Die Antwort ändert sich nicht wirklich. Dann musst Du in der überschriebenen halt die gleichen Argumente entgegennehmen und beim Aufruf der Methode in der Basisklasse übergeben.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Bevor du auf falsche Ideen kommst: du musst natürlich nicht jeden Parameter einzeln übergeben

Code: Alles auswählen

class B(A):
    def func_a(*args, **kwds):
        print 'Ich soll vor func_a ausgeführt werden!!'
        A.func_a(*args, **kwds)
Das Leben ist wie ein Tennisball.
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

hmm echt schade, das macht die sache aus meiner sicht deutlich komplizierter :/ wäre echt einfach gewesen, wenn man eine zweifunktion hinten oder vorne anhängen könnte.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Noch weniger Code geht doch kaum. Natürlich könnte man hier und dort noch mit einer Dekoratorfunktion spielen, aber das lohnt sich nur, wenn der Anwendungsfall häufig auftritt.
Das Leben ist wie ein Tennisball.
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Naja, vielen dank euch allen, habs hinbekommen! :)

Wobei das arbeiten mit Dekoratorfunktionen sicherlich auch mal sehr interessant wäre. Das wird wohl auch in nächster Zeit früher oder später auf mich zu kommen :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Brainsucker hat geschrieben:Naja, vielen dank euch allen, habs hinbekommen! :)
Wie denn? Mit dem Vorschlag von EyDu?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Brainsucker
User
Beiträge: 68
Registriert: Mittwoch 16. November 2011, 23:20

Hyperion hat geschrieben:Wie denn? Mit dem Vorschlag von EyDu?
So ist es.
Ich war nur immer zu blöd beim neuen Funktionsaufruf das self als ersten parameter hinzuzufügen, desshalb hab ich immer so verdutzt geschaut, als da so massig errors auftauchten. Nun hats aber funktioniert.
Antworten