Seite 1 von 1

Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 18:10
von S3raph1m
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?

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 18:19
von jbs
Klingt nach sehr krudem Design. Kannst du uns ein Beispiel geben?

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 18:49
von 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__()`.

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 18:51
von S3raph1m
Hi,
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)

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.

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 18:52
von S3raph1m
ahhh, okay blackjack hat meine frage beantwortet.
es werden also alle attribute vererbt - fand ich jetzt auf den ersten blick etwas unpraktisch ^^

danke und gruß

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 19:06
von 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.

Re: Vererbung einzelner module?

Verfasst: Samstag 4. August 2012, 19:56
von S3raph1m
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