Ich kenne virtuelle Methoden aus PHP oder Java.
Wie können sie in Python implementiert werden?
Oder muss ich eine leere Methode in einer abstrakten Klasse definieren und überschreiben?
quelle
Ich kenne virtuelle Methoden aus PHP oder Java.
Wie können sie in Python implementiert werden?
Oder muss ich eine leere Methode in einer abstrakten Klasse definieren und überschreiben?
Sicher, und Sie müssen nicht einmal eine Methode in der Basisklasse definieren. In Python sind Methoden besser als virtuell - sie sind vollständig dynamisch, da die Eingabe in Python die Eingabe von Enten ist .
class Dog:
def say(self):
print "hau"
class Cat:
def say(self):
print "meow"
pet = Dog()
pet.say() # prints "hau"
another_pet = Cat()
another_pet.say() # prints "meow"
my_pets = [pet, another_pet]
for a_pet in my_pets:
a_pet.say()
Cat
und Dog
in Python müssen Sie nicht einmal von einer gemeinsamen Basisklasse ableiten, um dieses Verhalten zuzulassen - Sie erhalten es kostenlos. Einige Programmierer bevorzugen es jedoch, ihre Klassenhierarchien strenger zu definieren, um sie besser zu dokumentieren und eine gewisse Strenge bei der Eingabe aufzuerlegen . Dies ist auch möglich - siehe zum Beispiel das abc
Standardmodul .
raise NotImplementedError()
Dies ist die empfohlene Ausnahme für "reine virtuelle Methoden" von "abstrakten" Basisklassen, die keine Methode implementieren.
https://docs.python.org/3.5/library/exceptions.html#NotImplementedError sagt:
Wie andere sagten, handelt es sich meistens um eine Dokumentationskonvention, die nicht erforderlich ist. Auf diese Weise erhalten Sie jedoch eine aussagekräftigere Ausnahme als einen fehlenden Attributfehler.
Z.B:
gibt:
Verwandte: Ist es möglich, abstrakte Klassen in Python zu erstellen?
quelle
Python-Methoden sind immer virtuell.
quelle
Tatsächlich bietet Python in Version 2.6 so genannte abstrakte Basisklassen, und Sie können virtuelle Methoden wie folgt explizit festlegen:
Es funktioniert sehr gut, vorausgesetzt, die Klasse erbt nicht von Klassen, die bereits Metaklassen verwenden.
Quelle: http://docs.python.org/2/library/abc.html
quelle
wie Ignacio noch sagte Irgendwie kann Klassenvererbung ein besserer Ansatz sein, um das zu implementieren, was Sie wollen.
Ergebnisse sollten sein:
quelle
So etwas wie eine virtuelle Methode in C ++ (Aufruf der Methodenimplementierung einer abgeleiteten Klasse über eine Referenz oder einen Zeiger auf die Basisklasse) ist in Python nicht sinnvoll, da Python keine Typisierung hat. (Ich weiß allerdings nicht, wie virtuelle Methoden in Java und PHP funktionieren.)
Wenn Sie jedoch mit "virtuell" die unterste Implementierung in der Vererbungshierarchie aufrufen, erhalten Sie dies immer in Python, wie mehrere Antworten zeigen.
Na ja, fast immer ...
Wie dplamp hervorhob, verhalten sich nicht alle Methoden in Python so. Dunder Methode nicht. Und ich denke, das ist eine nicht so bekannte Funktion.
Betrachten Sie dieses künstliche Beispiel
Jetzt
Betrachten Sie jedoch diesen
Jetzt
Das einzige, was wir geändert haben, war zu machen
prop_a()
eine Dunder-Methode.Ein Problem mit dem ersten Verhalten kann sein, dass Sie das Verhalten
prop_a()
in der abgeleiteten Klasse nicht ändern können, ohne das Verhalten von zu beeinflussenprop_b()
. Dieser sehr schöne Vortrag von Raymond Hettinger gibt ein Beispiel für einen Anwendungsfall, bei dem dies unpraktisch ist.quelle