klassen vererbung

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
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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
When we say computer, we mean the electronic computer.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

ich sehe da keinen fehler. also weißt du es auch nicht?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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?
When we say computer, we mean the electronic computer.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

wenn ich das mache kommt aber folgende Fehlermeldung: AttributeError: 'super' object has no attribute 'print' how can i fix it?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@jan.b: welche Python-Version benutzt Du denn und was hast Du genau probiert?
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

vielen dank. ich weiß nicht, warum es bei mir vorher nicht funktioniert hat.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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. :roll:
Antworten