【问题标题】:Python - Re-assigning parent attribute in derived classPython - 在派生类中重新分配父属性
【发布时间】:2017-11-10 15:14:53
【问题描述】:

我有以下代码:

class Parent():
    def __init__(self,name):
       self.name = name
    def printing(self):
       print(self.name)

class Child (Parent):
    def __init__(self,name,country):
       Parent.name = 'Roger'
       self.name = name
       self.country = country
    def Output(self):
       print(Parent.name,self.name,self.country)

obj = Child('Rafael','France')

现在,obj.Output() 返回:Roger Rafael France

obj.printname() 返回:Rafael

谁能解释为什么分配Parent.name = 'Roger' 没有在父类中改变它?想了解为什么 `Parent.name' 没有被覆盖。

【问题讨论】:

  • 我认为您将类属性与对象属性混合在一起
  • 对,无论如何在这种情况下,让Child 继承自Parent 没有多大意义,因为您将覆盖Parent 属性,而obj.name 只能引用单个值

标签: python class inheritance


【解决方案1】:

当您在 Child 的 init 中创建自己的 self.name 时,您隐藏了对 Parent 的 self.name 的引用。

你要做的是调用Parent的构造函数:How to invoke the super constructor?

然后,像这样访问它: Access parent class instance attribute from child class instance?

【讨论】:

    【解决方案2】:

    因为obj = Child('Rafael','France')Child 类的一个实例,并且在行中:

       Parent.name = 'Roger'
       self.name = name
    

    您使用您在构造函数中设置的实例名称 self.name = name 覆盖 Roger 的名称。

    要按照您想要的方式工作,代码应如下所示:

    class Parent():
        def __init__(self,name):
           self.name = name
    
        def printing(self):
           print(self.name)
    
    class Child (Parent):
        def __init__(self,name,country):
           self.name = name
           Parent.name = 'Roger' # but this is awful
           self.country = country
    
    obj = Child('Rafael','France')
    obj.printing()
    > Roger
    

    【讨论】:

    • self.name 指的是ParentChild 类中的相同属性。我认为没有另一个就不可能修改一个。
    • 对,但super().__init__(name='Roger') 也将更改self.name,因此obj.name 将始终为Roger
    • @ArthurVigil 同意
    • 我的 Jupyter 笔记本中的上述代码仍会导致输出“Rafael”。但是,理解您的观点 - self.name=name 覆盖了 Parent.name = Roger。删除子 __init__ 中的 self.name=name 会导致输出“Roger”。我认为语句的顺序没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多