Klassen und Vererbungen

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
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

Hallöchen liebes Forum, ich experimentiere grad etwas mit Klassen und Vererbungen herum und hab hier einen Code aufgrund einer Übungsaufgabe erstellt (die Kommentare waren gegeben) und ich glaube da tummeln sich vermutlich viele fehler, aber nun erstmal zur Fehlermeldung, denn bei der Ausgabe kommt immer: __init__() missing 1 required positional argument: 'fahrer'

Bin etwas ratlos was das angeht. Vielleicht kann mir ja jemand helfen, die Fehler alle raus zu bekommen :)


Code: Alles auswählen

# mutterklasse Kraftfahzeug
class Kraftfahrzeug(object):
    ANZAHL = 0

    
    # klassenvariable ANZAHL (int) - repraesentiert die anzahl der existierenden instanzen
    # muss bei der instanziierung eines objekts also um 1 erhoeht werden
    # und bei der zerstoerung eines objekts um 1 verringert werden

    def __init__(self, idnr, marke, leistung, fahrer):
        self.idnr = idnr
        self.marke = marke
        self.leistung = leistung
        self.fahrer = fahrer
        self.__class__.ANZAHL += 1
        # attribute: idnr (int), marke (str), leistung (int), fahrer (str)
        # fahrer wird nicht uebergeben sondern mit None initialisiert

    def anlassen(self):
        print ("Das Fahrzeug laeuft")
        # ausgabe: "Das Fahrzeug laeuft"

    def hupen(self):
        print ("")
        # ausgabe: ""
        # wird in subklassen mit spezifischem inhalt ueberschrieben

    def getId(self):
        print (self.idnr)
        # rueckgabe: idnr

    def getLeistung(self):
        return self.leistung + "PS"
        # rueckgabe: "<leistung> PS" als string

    def setFahrer(self):
        self.fahrer = ""
        print (self.fahrer + " steigt ein")

        # ein name wird uebergeben und dem attribut fahrer zugewiesen
        # ausgabe: "<name> steigt ein"
        
    def __del__(self):
        self.__class__.ANZAHL -= 1
        # in dieser methode kann man spezifizieren, was passiert, wenn
        # ein objekt geloescht/zerstoert wird

    def getAnzahlFahrzeuge(self):
        return self.ANZAHL


# klasse Motorrad, erbt von Kraftfahrzeug
class Motorrad(Kraftfahrzeug):

    def __init__(self, beiwagen):
        Kraftfahrzeug.__init__(self,idnr, marke, leistung, fahrer)
        beiwagen = input()
        self.beiwagen = beiwagen
        # zusaetzliche attribute: beiwagen (bool)
        # beiwagen wird uebergeben

    def hupen(self):
        print ("Motorrad hupt")
        # ausgabe: "Motorrad hupt"


# klasse Auto, erbt von Kraftfahrzeug
class Auto(Kraftfahrzeug):

    def __init__(self,fahrzeugklasse):
        Kraftfahrzeug.__init__(self,idnr, marke, leistung, fahrer)
        fahrezugklasse = input()
        self.fahrzeugklasse = fahrzeugklasse
        # zusaetzliche attribute: fahrzeugklasse (str)
        # fahrzeugklasse wird uebergeben

    def hupen(self):
        print ("Auto hupt")
        # ausgabe: "Auto hupt"


# klasse Sportwagen, erbt von Auto
class Sportwagen(Auto):

    def __init__(self,hoechstgeschwindigkeit):
        Auto.__init__(self,fahrzeugklasse)
        hoechstgeschwindigkeit = input()
        self.hoechstgeschwindigkeit = hoechstgeschwindigkeit
        self.fahrzeugklasse = "Sportwagen"
        # zusaetzliche attribute: hoechstgeschwindigkeit
        # hoechstgeschwindigkeit wird uebergeben und ist ein integer
        # fahrzeugklasse vom Sportwagen ist immer "Sportwagen"

    def hupen(self):
        print ("Sportwagen hupt")
        # ausgabe: "Sportwagen hupt"

    def getHoechstgeschwindigkeit(self):
        return hoechstgeschwindigkeit

        # rueckgabe: hoechstgeschwindigkeit


# klasse LKW, erbt von Kraftfahrzeug
class LKW(Kraftfahrzeug):

    def __init__(self, ladeflaeche):
        Kraftfahrzeug.__init__(self,idnr, marke, leistung, fahrer)
        self.ladeflaeche = ladeflaeche

        # zusaetzliche attribute: ladeflaeche (float)
        
    def hupen(self):
        print ("LKW hupt")

        # ausgabe: "LKW hupt"

generic = Kraftfahrzeug(1, "nix", 0)

lkw1 = LKW(6489, "MAN", 500, "20")
lkw2 = LKW(6408, "Volvo", 400, "27")

lkw1.setFahrer("Klaus")
lkw1.anlassen()
lkw1.hupen()

lkw2.setFahrer("Hubert")
lkw2.anlassen()
lkw2.hupen()

auto1 = Auto(12323, "Opel", 105, "Caravan")
auto2 = Sportwagen(786487, "Porsche", 270, 370)

auto1.setFahrer("Dominik")
auto1.hupen()

auto2.setFahrer("Simon")
auto2.hupen()

print(auto1.getLeistung())
print(auto2.getLeistung())

motorrad1 = Motorrad(9877, "Harley Davidson", 40, True)

motorrad1.setFahrer("Wilczek")
motorrad1.hupen()
print(motorrad1.getLeistung())

print(generic.getAnzahlFahrzeuge())
del auto1
print(generic.getAnzahlFahrzeuge())
Zuletzt geändert von Anonymous am Sonntag 10. Januar 2016, 19:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@BMTP: dann zähl doch mal, wieviel Parameter Kraftfahrzeug.__init__ braucht und wieviele Du beim Aufruf angibst.

Wirf erstmal ANZAHL raus und lösch __del__ gleich mit. Das ist keine sinnvolle Art, irgendetwas zu zählen. Wenn Du wissen willst, wieviele Fahrzeuge es gibt, steck sie alle in eine Liste und gib die Länge der Liste aus.

"getId" hat wenig mit get zu tun. setFahrer setzt auch nicht wirklich was sinnvolles. Die ganzen get- und set-Methoden sind sowieso überflüssig, weil man auch direkt auf die Attribute der Instanzen zugreifen kann.

Die abgeleiteten Klassen benutzen beim Aufruf von Kraftfahrzeug.__init__ Variablen, die nicht existieren. Ein "input" in __init__ will man nicht haben. Objekte müssen initiallisiert werden können, ohne Auf Nutzereingaben zu warten.
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

@Sirius3: Ich hab oben ja fahrer angegeben, deswege gebe ich es auch bei Kraftfahrzeug__init__ an, aber diese Variable verwirrt mich sowieso, da ja steht sie solle über None intalisiert werden und ich weiß nicht genau was das heißt.
Das mit dem Zählen und die jeweiligen def und get und set und so war ja vorgegeben, sollten also nur entsprechend der Kommentare ausgefüllt werden.
BlackJack

@BMTP: Das wird wohl heissen das dieses Argument den Defaultwert `None` bekommen soll, damit man dafür kein Argument übergeben muss (aber kann).
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

@BlackJack: Ok, das habe ich mir auch schon so gedacht, nur finde ich es halt seltsam, dass die Unterklassen dass anscheinend nicht erfassen können, obwohl ich ja fahrer wie alle anderen attribute auch nenne :K
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@BMTP: lokale Variablennamen haben doch nicht automagisch Verknüpfungen zu Attributen von irgendwelchen Klassen.

Dass etwas vorgegeben ist, heißt ja nicht, dass es gut ist. Seh es jetzt als Übung und merke Dir, dass Du so etwas nie selbst schreiben solltest. Vergiß vor allem sofort wieder, dass es '__del__' überhaupt gibt. Du wirst es sehr wahrscheinlich nie brauchen.
BlackJack

@BMTP: Wenn ich mir den Kommentar jetzt nochmal so durchlese denke ich das es nicht einmal ein Defaultwert sein soll sondern tatsächlich überhaupt nicht in der Signatur von `Kraftfahrzeug.__init__()` auftauchen soll. Ich hatte da mit dem Defaultwert wahrscheinlich schon zu ”sinnvoll” gedacht. :-)
Antworten