如何基于超类

时间:2016-05-07 17:36:07

标签: python class python-3.x inheritance

我创建了类Employee:

class Employee:
    def __init__(self,name,salary = 1500):
        self.__name = name
        self.__salary = salary

然后,我想定义子类教授,其薪水是员工的3 *工资。但是我需要根据超类改变我的子类的工资。

class Professor(Employee):
    def __init__(self,name,salary):
        Employee.__init__(self,name,salary)
        self.__salary = self.__salary*3

但它给我一个错误"

__init__() missing 1 required positional argument: 'salary'"

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

这是因为您已设置属性以通过为其提供__前缀来模拟私有变量。 Python破坏了这些变量并使其难以从其他类访问。你可以轻松地解决你的问题,不要让他们私下':

class Employee:
    def __init__(self,name,salary = 1500):
        self.name = name
        self.salary = salary

class Professor(Employee):

    def __init__(self,name,salary):
        Employee.__init__(self,name,salary)
        self.salary = self.salary * 3

如果你出于某种原因真的需要让他们成为私人的'变量,您可以在子类中访问它们,如下所示:self._Employee__salary

class Employee:
    def __init__(self,name,salary = 1500):
        self.__name = name
        self.__salary = salary

class Professor(Employee):

    def __init__(self,name,salary):
        Employee.__init__(self,name,salary)
        self._Employee__salary = self._Employee__salary * 3

如果您想拥有教授对象的默认薪水,则需要在__init__的{​​{1}}函数中明确添加:

Professor

关于继承默认参数值的问题:你不能真正这样做,因为你正在重新定义class Professor(Employee): def __init__(self,name,salary = 1500): Employee.__init__(self,name,salary) self._Employee__salary = self._Employee__salary * 3 类中的__init__(这是有意义的,因为你正在扩展它功能)。你可以用你的默认参数解决这个问题,但它不是很漂亮,我不推荐它:

Professor