Vererbung einzelner module?

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
S3raph1m
User
Beiträge: 4
Registriert: Samstag 4. August 2012, 18:05

Samstag 4. August 2012, 18:10

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?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Samstag 4. August 2012, 18:19

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]
BlackJack

Samstag 4. August 2012, 18:49

@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__()`.
S3raph1m
User
Beiträge: 4
Registriert: Samstag 4. August 2012, 18:05

Samstag 4. August 2012, 18:51

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.
S3raph1m
User
Beiträge: 4
Registriert: Samstag 4. August 2012, 18:05

Samstag 4. August 2012, 18:52

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ß
BlackJack

Samstag 4. August 2012, 19:06

@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.
S3raph1m
User
Beiträge: 4
Registriert: Samstag 4. August 2012, 18:05

Samstag 4. August 2012, 19:56

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
Antworten