在派生类中访问已更改的基类实例属性

问题描述:

我无法理解继承中实例变量的逻辑。 这是我(简化)代码注释解释我是如何理解它的行为:在派生类中访问已更改的基类实例属性

class Main(object): 

    def __init__(self): 
     self.p = Parent() # self.parameter = [] 
     self.c = Child() # self.parameter = [] 

    def run(self): 
     self.p.setting() # assigning value to self.parameter 
     self.c.getting() 


class Parent(object): 

    def __init__(self): 
     self.parameter = [] 

    def setting(self): 
     self.parameter = [1, 2, 3] 


class Child(Parent): 
    # not redefining __init__, so Parent __init__ is called 

    def getting(self): 
     # value was assigned to self.parameter in setting method, 
     # called before getting 
     print self.parameter 


Main().run() 

getting打印[],而不是[1, 2, 3]我的预期。为什么这样?由于Child__init__Parent,在开始self.parameter = []两者,但为什么它仍然是[]时,它被分配一个值很长的Child().__init__被称为?我应该怎么做才能在getting中更改self.parameter值?

+0

Python是不是Java;不是每件事都必须是一个阶级。摆脱'Main'。 – chepner

让我们来执行您的代码。

  1. main实例使用Main()创建。

在这个时刻,我们有main.p = []main.s = [],如Main.__init__

定义
  1. main.run()被调用,它调用main.p.setting()main.c.getting()
  2. 所以现在,main.p.setting()将的parameter值更改为[1,2,3],而main.c.setting()仅打印其自身的parameter值e,它仍然是[],因为它从未被修改过。

    如果要修改main.c.parameter值,只需拨打main.c.setting()

    main = Main() 
    main.c.setting() 
    main.run() 
    
开始=>

您不是继承Main中的任何内容,而是添加成员变量。你表达的是“有”的关系,而不是“是”。

要继承,定义Main这样:

class Main(Child): 

    def run(self): 
     self.setting() 
     self.getting() 

以您目前的代码,你可以调用main_instance.run()后检查main_instance.p.parameter,看到返回[1, 2, 3]