Hallo,
ich hab ein problem mit der vererbung.
angenommen ich habe eine superklasse und möchte nur einzelne module an eine subklasse vererben - ist das möglich(selektive vererbung)?
oder anders gefragt, muss ich immer den constructor der superklasse mitvererben?
Vererbung einzelner module?
Klingt nach sehr krudem Design. Kannst du uns ein Beispiel geben?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
-
BlackJack
@S3raph1m: Ich habe den Verdacht Du verstehst unter Modulen etwas anderes als die Python-Dokumentation.
Eine Subklasse erbt grundsätzlich alle Attribute der Basisklasse. Das betrifft sowohl den Konstruktor (`__new__()`) als auch die `__init__()`.
Eine Subklasse erbt grundsätzlich alle Attribute der Basisklasse. Das betrifft sowohl den Konstruktor (`__new__()`) als auch die `__init__()`.
Hi,
wird wohl eher unverständnis von vererbung sein als krudes design XD.
bin totaler anfänger...aber hier mal ein beispiel
angenommen ich möchte nur das modul haircolor vererben ohne name und age - ist das möglich ohne praktisch den gesamten constructor Person.__init__(self,name,age) weiterzugeben?
wahrscheinlich nicht und ne noob frageXD.
wird wohl eher unverständnis von vererbung sein als krudes design XD.
bin totaler anfänger...aber hier mal ein beispiel
Code: Alles auswählen
class Person():
def __init__(self,name,age):
self.name=name
self.age=age
def haircolor(self,color):
self.color=color
def __str__(self):
return "My name is {}. I am {} years old.".format(self.name,self.age)
class Military(Person):
def __init__(self,name,age,rank):
Person.__init__(self, name, age) #hier ist das probelm, muss #der contructor der parent-class übergeben werden?
self.rank=rank
def __str__(self):
return Person.__str__(self) +"I am a {0}".format(self.rank)
wahrscheinlich nicht und ne noob frageXD.
-
BlackJack
@S3raph1m: Das was Du als unpraktisch bezeichnest ist der Sinn von Vererbung. Wenn das für Deinen speziellen Einsatz unpraktisch ist, dann ist Vererbung ganz einfach das falsche Mittel.
Ich verstehe auch das Beispiel nicht, warum sollte ein Militärangehöriger keinen Namen und kein Alter haben sollen?
Vererbung ist eine „ist-ein(e)”-Beziehung. Ein Militärangehöriger ist eine Person. Im Idealfall kann man ein Exemplar der Unterklasse überall dort übergeben wo auch ein Exemplar der Basisklasse möglich ist. Das geht nicht wenn dem Exemplar der Unterklasse Attribute oder Methoden fehlen.
Du benutzt den Begriff „Modul” falsch. Und wo Du im Kommentar bei der `__init__()` von `Military` „übergeben” geschrieben hast, meinst Du eigentlich „aufrufen”. Du *musst* die `__init__()` der Basisklasse nicht aufrufen, wenn da aber etwas wichtiges gemacht wird, was den Zustand des Exemplars beeinflusst, dann sollte man das natürlich tun, damit das Programm später nicht auf Nase fliegt. Die `Military.__str__()`-Implementierung würde zum Beispiel nicht funktionieren wenn Name und Alter nicht gesetzt wurden.
Die `Person.haircolor()`-Methode sollte besser `set_haircolor()` heissen und eigentlich sollte man sie weg lassen. Simple Getter und Setter sind in Python nicht üblich. Und alle Attribute sollten nach der Abarbeitung der `__init__()`-Methode gesetzt worden sein. Wenn man in beliebigen Methoden neue Attribute einführt, wird der Datenfluss unübersichtlich und die Fehlersuche kann dann recht nervenaufreibend werden.
Ich verstehe auch das Beispiel nicht, warum sollte ein Militärangehöriger keinen Namen und kein Alter haben sollen?
Vererbung ist eine „ist-ein(e)”-Beziehung. Ein Militärangehöriger ist eine Person. Im Idealfall kann man ein Exemplar der Unterklasse überall dort übergeben wo auch ein Exemplar der Basisklasse möglich ist. Das geht nicht wenn dem Exemplar der Unterklasse Attribute oder Methoden fehlen.
Du benutzt den Begriff „Modul” falsch. Und wo Du im Kommentar bei der `__init__()` von `Military` „übergeben” geschrieben hast, meinst Du eigentlich „aufrufen”. Du *musst* die `__init__()` der Basisklasse nicht aufrufen, wenn da aber etwas wichtiges gemacht wird, was den Zustand des Exemplars beeinflusst, dann sollte man das natürlich tun, damit das Programm später nicht auf Nase fliegt. Die `Military.__str__()`-Implementierung würde zum Beispiel nicht funktionieren wenn Name und Alter nicht gesetzt wurden.
Die `Person.haircolor()`-Methode sollte besser `set_haircolor()` heissen und eigentlich sollte man sie weg lassen. Simple Getter und Setter sind in Python nicht üblich. Und alle Attribute sollten nach der Abarbeitung der `__init__()`-Methode gesetzt worden sein. Wenn man in beliebigen Methoden neue Attribute einführt, wird der Datenfluss unübersichtlich und die Fehlersuche kann dann recht nervenaufreibend werden.
hmm,
ja wie schon erwähnt hatte ich das konzept wohl nicht ganz zu ende gedacht - aber ich denke so langsam wird mir die eigentliche bedeutung von vererbung und klassen klar...
es sollten also alle attribute in die init methode geschrieben werden und die funktionen/methoden mit ihnen arbeiten - wenn ichs recht verstehe XD
ja wie schon erwähnt hatte ich das konzept wohl nicht ganz zu ende gedacht - aber ich denke so langsam wird mir die eigentliche bedeutung von vererbung und klassen klar...
es sollten also alle attribute in die init methode geschrieben werden und die funktionen/methoden mit ihnen arbeiten - wenn ichs recht verstehe XD
