Problem: in Subclasses wird eine Methode namens `speak` ignoriert, d.h. die überschreibt den in der Baseclass in `__init__` zugewiesenen Wert nicht. Ich kann mir derzeit nur behelfen, indem ich `__init__` re-definiere und manuell `speak` neu mittels einer Hilfsfunktion zuweise, siehe Code unten.
Wieso? Der Umweg über die Hilfsfunktion `yell` und die Re-Definition von `__init__` ist eigentlich unnötig und daher unschön. V.a. aber verstehe ich es nicht...
Code: Alles auswählen
class Man:
def __init__(self):
self.speak = self.__default_speak
def __default_speak(self, text):
return text
def speaks_special(self):
return not self.speak == self.__default_speak
class ShoutingMan(Man):
def speak(self, text):
return text.upper()
sman = Man()
print sman.speak("Hello")
# prints: Hello, `speak` seems not to be overwritten in class `ShoutingMan`
print sman.speaks_special()
# prints: False
class YellingMan(Man):
def __init__(self):
Man.__init__(self)
self.speak = self.yell
def yell(self, text):
return text.upper()
yman = YellingMan()
print yman.speak("Hello")
# prints: HELLO, `speak` has been overwritten in class `YellingMan`
print yman.speaks_special()
# prints: True