2017-04-22 6 views
0

Ich versuche, Python zu lernen (mit wenig Programmiererfahrung) und steckte auf dieses Problem auf Codeacademy über Methoden von einer Basisklasse nach dem Überschreiben in einer Unterklasse stecken.Python: Problem mit der Vererbung und Super Call

Dies ist der Code:

class Employee(object): 
    """Models real-life employees!""" 
    def __init__(self, employee_name): 
     self.employee_name = employee_name 

    def calculate_wage(self, hours): 
     self.hours = hours 
     return hours * 20.00 


class PartTimeEmployee(Employee): 
    def calculate_wage(self, hours): 
     self.hours = hours 
     return hours * 12.00 

    def full_time_wage(self, hours): 
     super(PartTimeEmployee, self).calculate_wage(self, hours) 

milton = PartTimeEmployee("Milton") 
print(milton.full_time_wage(10)) 

Leider ist die folgende wirft:

Traceback (most recent call last): 
    File "python", line 20, in <module> 
    File "python", line 17, in full_time_wage 
TypeError: calculate_wage() takes exactly 2 arguments (3 given) 

Also irgendwo eine Variable zu viele übergeben wird, aber ich kann nicht herausfinden, wo.

Update 1:

die Traceback Anruf Gelöst von 17.

jedoch nur wenige Stunden auf Linie, die, mein Ergebnis jetzt print(milton.full_time_wage(10)) Aufruf gibt mir None statt 200, wie ich erwarten würde. Kann mir jemand vielleicht erklären, was ich falsch mache?

return super(PartTimeEmployee, self).calculate_wage(hours) 

Der Methodenaufruf selbst schon passiert:

Dank

+0

Danke, dass Pflege Meldung des Fehlers nahm. Aus irgendeinem Grund wird dies - für den obigen Aufruf "print (milton.full_time_wage (10))" - "None" statt "20" zurückgeben? – mor3dr3ad

Antwort

1

Sie brauchen nicht mit sich selbst als einer der Parameter calculate_wage() aufrufen:

sein sollte:

class PartTimeEmployee(Employee): 
    def calculate_wage(self, hours): 
     self.hours = hours 
     return hours * 12.00 

    def full_time_wage(self, hours): 
     super(PartTimeEmployee, self).calculate_wage(hours) 
+0

Danke, das hat sich um die Fehlermeldung gekümmert. Aus irgendeinem Grund wird dies jedoch - für den obigen Aufruf "print (milton.full_time_wage (10))" - "None" anstelle von "20" zurückgeben. – mor3dr3ad

+0

@more_dread Haben Sie eine 'return' Anweisung? Nein, du tust nicht ... jede Funktion ohne eine 'return'-Anweisung gibt' None' zurück – abccd

1

Die Linie sein muss. Sie müssen das Ergebnis des Aufrufs der Methode zurückgeben.

1

Problem ist die zweite self, die Sie an die Funktion übergeben.

super(PartTimeEmployee, self).calculate_wage(self, hours) 
              ^

Wenn Sie passieren die self zum super es wird automatisch die Superklasse an die Funktion übergeben (wenn es diese Funktion zur Verfügung stellt). Ansonsten sucht es nach der Funktion in anderen Basen in Ihren Klassen __mro__.

Lesen Sie mehr in der Dokumentation: https://docs.python.org/3.6/library/functions.html#super

0

Also, um die Fehlermeldung wurde durch alle obigen Antworten gelöst.

Und das Problem mit meinem Code nichts zurückkehrt, ist, dass ich die return Anruf auf der Leitung 17 vergessen - Ich bin ein Idiot ..