【问题标题】:How to chang attribute of subclass based on superclass如何根据超类更改子类的属性
【发布时间】:2016-05-07 17:36:07
【问题描述】:

我创建了 Employee 类:

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

然后,我想定义子类Professor,其薪水是雇员的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'"

我该如何解决这个问题?

【问题讨论】:

    标签: python class python-3.x inheritance


    【解决方案1】:

    发生这种情况是因为您已将属性设置为通过为私有变量提供__ 前缀来模拟私有变量。 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
    

    如果你想为你的 Professor 对象设置一个默认薪水,你需要在 Professor__init__ 函数中显式添加它:

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

    关于继承默认参数值的问题:你不能真正做到,因为你在你的Professor 类中重新定义__init__(这是有道理的,因为你正在扩展它的功能)。你可以用你的默认参数以某种方式解决这个问题,但它不是很漂亮,我不推荐它:

    class Employee:
        def __init__(self,name,salary):
            self.__name = name
            if salary == None:
                self.__salary = 1500
            else:
                self.__salary = salary
    
    class Professor(Employee):
    
        def __init__(self,name,salary = None):
            Employee.__init__(self,name,salary)
            self._Employee__salary = self._Employee__salary * 3
    

    【讨论】:

    • 使用此代码,您仍然会遇到相同的错误:__init__() missing 1 required positional argument: 'salary'。我一直在尝试寻找解决方案,但问题仍然存在,位置 salary = 1500 没有进入 Professor 子类,因此我们仍然遇到位置错误。在创建Professor 类的实例时,如果您将位置参数放入其中,它就会起作用,例如tony = Professor('tony', 100)
    • 我不知道你说的是我的哪个代码版本,但我没有收到任何错误。
    • 哦,我们在谈论两个不同的错误:D 是的,Professor 中的 __init__ 函数不是从 Employee 继承的。由于salary 参数在Professor 中没有默认值,因此您必须在实例化教授对象时显式传递薪水值。
    • 是的,我指的是您使用私有变量的第二个代码块。试试tony = Professor('tony', 100)tony = Professor('tony')之间的区别
    • 查看最后的编辑。 @Darren Haynes 是的,这是他遇到的第一个问题,但在正确实例化教授之后,他也会立即遇到下一个问题 :)
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2017-01-31
    • 2020-11-10
    • 2020-10-02
    相关资源
    最近更新 更多