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

时间:2017-10-10 13:46:59

标签: python python-2.7 inheritance instance-variables

我无法理解继承中实例变量的逻辑。 这是我的(简化)代码,其中的注释解释了我如何理解其行为:

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 = [],但为什么在{{1}之后很长时间内为其分配了一个值[] }} 被称为?如何在Child().__init__中更改self.parameter值?

2 个答案:

答案 0 :(得分:1)

让我们执行您的代码。

  1. main实例是使用Main()创建的。
  2. 此时我们main.p = []main.s = []已定义为Main.__init__

    1. main.run()被调用,并调用main.p.setting()main.c.getting()
    2. 现在,main.p.setting()parameter的{​​{1}}值更改为main.p[1,2,3]只打印自己的main.c.setting()值,仍然是parameter,因为它从未被修改过。

      如果您想修改[]值,只需致电main.c.parameter

      即可
      main.c.setting()

答案 1 :(得分:0)

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

要继承,请定义Main

class Main(Child):

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

使用您当前的代码,您可以在致电main_instance.p.parameter后检查main_instance.run()并查看是否已返回[1, 2, 3]