Python:继承和超级调用的麻烦

时间:2017-04-22 13:10:57

标签: python inheritance super

我正在尝试学习python(之前的编程经验很少)并且在codeacademy上遇到了关于在子类中覆盖它后从基类调用方法的问题。

这是代码:

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))

不幸的是,它引发了以下情况:

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)

所以在某个地方,一个变量太多被移交,但是,我无法弄清楚在哪里。

更新1:

通过仅在第17行传递小时数来解决Traceback调用。

然而,现在我的结果是打电话     print(milton.full_time_wage(10)) 正如我所料,我给了None而不是200。 有人可能会告诉我我的错误吗?

由于

4 个答案:

答案 0 :(得分:1)

该行必须是:

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

方法调用已经通过self。你必须返回调用方法的结果。

答案 1 :(得分:1)

问题是您传递给该函数的第二个self

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

当你将self传递给super时,它会自动将超类传递给函数(如果它提供了该函数)。否则,它将在您的类__mro__中的其他基础中查找该函数。

在文档中阅读更多内容:https://docs.python.org/3.6/library/functions.html#super

答案 2 :(得分:1)

您不需要使用self调用calculate_wage()作为参数之一:

应该是:

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)

答案 3 :(得分:0)

因此,上面的所有答案都解决了错误消息。

我的代码没有返回的问题是我忘记了第17行的return电话 - 我是个白痴......