Seite 1 von 1
klassen vererbung
Verfasst: Freitag 20. April 2018, 20:32
von jan.b
Code: Alles auswählen
class überklasse:
def print(self):
print("ü1")
pass
class unterklasse1(überklasse):
def print1(self):
print("u1")
pass
class unterklasse2(überklasse):
def print2(self):
print("u2")
pass
x1 = unterklasse1()
x2= unterklasse2()
x1.print1()
x2.print2()
wie kann ich den Code so umfunktionieren, dass die kinder Klassen "unterklasse1" und "Unterklasse2" die Funktion von überklasse mit übernehmen, und ebenfalls ü1 ausgeben?
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 20:45
von sls
In dem du über die Objekte 'x1' und 'x2' die Methode der "Überklasse" aufrufst. Es ist allerdings keine besonders gute Idee print() als Methodenname zu verwenden, da es sich um eine von Python reservierte Methode handelt (Keywords). Das 'pass' ist btw. sinnlos und dient dafür, dass Methoden erstmal erstellt und später mit Code-Logik versehen werden.
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 21:02
von jan.b
Code: Alles auswählen
class überklasse:
def schreibe(self):
print("ü1")
pass
class unterklasse1(überklasse):
def schreibe1(self):
print("u1")
pass
class unterklasse2(überklasse):
def schreibe2(self):
print("u2")
pass
x1 = unterklasse1()
x2= unterklasse2()
x1.schreibe1()
x2.schreibe2()
x1.schreibe()
aber auch hier wird nur ü1 ausgegeben. ich will ja die Funktion der Eltern klasse und einer kinder klasse ausgeben.
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 21:12
von sls
Die Methode schreibe() wird in den jeweiligen Unterklassen automatisch übernommen, sofern sie dort nicht erneut definiert wird. Somit solltest du nochmal prüfen, was da tatsächlich ausgegeben wird.
Code: Alles auswählen
class Ueberklasse:
def schreibe(self):
print("ü1")
class Unterklasse1(Ueberklasse):
def schreibe1(self):
print("u1")
class Unterklasse2(Ueberklasse):
def schreibe2(self):
print("u2")
x1 = Unterklasse1()
x2 = Unterklasse2()
x1.schreibe1() # Gibt 'u1' aus
x1.schreibe() # Gibt 'ü1' aus
x2.schreibe2() # Gibt 'u2' aus
x2.schreibe() # Gibt 'ü1' aus
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 21:19
von jan.b
ich sehe da keinen fehler. also weißt du es auch nicht?
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 21:25
von sls
jan.b hat geschrieben:aber auch hier wird nur ü1 ausgegeben. ich will ja die Funktion der Eltern klasse und einer kinder klasse ausgeben.
Es wird u1, u2 und ü1 ausgegeben. Läuft doch wie geschmiert, oder was für Wünsche hast du noch?
Re: klassen vererbung
Verfasst: Freitag 20. April 2018, 21:30
von jan.b
Es wird u1, u2 und ü1 ausgegeben. Läuft doch wie geschmiert, oder was für Wünsche hast du noch?[/quote]
mein wunsch ist, dass die Methode der Eltern klasse ZUSAMMEN mit der Methode der kinderklasse ausgegeben wird. also ich gebe nur x. ..... ein und dann wird sowohl die Methode von x1 ausgegeben, als auch die Methode der Eltern klasse.
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 10:14
von Sirius3
@jan.b: wie Du siehst kannst Du `x1.schreibe` aufrufen, also werden alle Methoden von überklasse an unterklasse1 vererbt. Da wird aber nichts auf magische Weise aufgerufen, sondern Du mußt das selbst machen. Stell Dir eine Klasse vor, die bei jedem Methodenaufruf alle Methoden der Überklasse aufruft? Mit welchen Parametern, wenn die Methoden Parameter brauchen? Du merkst hoffentlich selbst, dass das kein sinnvolles Verhalten einer Programmersprache wäre.
Code: Alles auswählen
class Überklasse:
def print(self):
print("ü1")
class Unterklasse1(Überklasse):
def print1(self):
print("u1")
self.print() # ruft eine Methode der Überklasse auf
Was Du wahrscheinlich eigentlich willst, ist das Überladen von Methoden, also eine Methode, die in der Unterklasse gleich heißt wie in der Überklasse. Da braucht man dann `super`:
Code: Alles auswählen
class Überklasse:
def print(self):
print("ü1")
class Unterklasse1(Überklasse):
def print(self):
print("u1")
super().print() # ruft eine Methode der Überklasse auf
@sls: `print` war in Python2 mal ein Keyword, inzwischen ist es eine ganz normale Funktion, so dass man sie auch ohne weiteres als Methoden-Namen verwenden kann.
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 16:14
von jan.b
wenn ich das mache kommt aber folgende Fehlermeldung: AttributeError: 'super' object has no attribute 'print' how can i fix it?
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 16:40
von Sirius3
@jan.b: welche Python-Version benutzt Du denn und was hast Du genau probiert?
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 16:44
von jan.b
Sirius3 hat geschrieben:@jan.b: welche Python-Version benutzt Du denn und was hast Du genau probiert?
ich habe Python 3.5.2 und ich habe nur deinen Code rein kopiert, um zugucken, ob die Eltern klasse mit ausgegeben wird.
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 19:08
von Sirius3
Mit Python 3.5 klappt das ohne Probleme:
Code: Alles auswählen
>>> class Überklasse:
... def print(self):
... print("ü1")
...
>>> class Unterklasse1(Überklasse):
... def print(self):
... print("u1")
... super().print() # ruft eine Methode der Überklasse auf
...
>>> u = Unterklasse1()
>>> u.print()
u1
ü1
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 20:38
von jan.b
vielen dank. ich weiß nicht, warum es bei mir vorher nicht funktioniert hat.
Re: klassen vererbung
Verfasst: Samstag 21. April 2018, 23:23
von Kebap
Es hat bei dir nicht funktioniert, weil du einfach Code zusammenkopierst, ohne zu verstehen, was der Code tut.
Wenn du deine FUnktion "schreibe" nennst und dann Code reinkopierst, der die Funktion "print" erwartet, wie soll es klappen?
Re: klassen vererbung
Verfasst: Sonntag 22. April 2018, 18:53
von jan.b
Kebap hat geschrieben:Es hat bei dir nicht funktioniert, weil du einfach Code zusammenkopierst, ohne zu verstehen, was der Code tut.
Wenn du deine FUnktion "schreibe" nennst und dann Code reinkopierst, der die Funktion "print" erwartet, wie soll es klappen?
war ja nicht so.
