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

Access changed base class instance attribute in derived class

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

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]。为什么会这样?由于 ChildParent 共享 __init__,在开始时两者都 self.parameter = [] 但为什么它在 [=21 之后很久才被赋值时仍然是 [] =] 被调用?我应该怎么做才能更改 getting 中的 self.parameter 值?

您没有继承 Main 中的任何内容,您正在添加成员变量。您表达的是 "has a" 关系,而不是 "is a".

要继承,请这样定义Main

class Main(Child):

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

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

让我们执行您的代码。

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

此时我们有 main.p = []main.s = [],如 Main.__init__

中所定义
  1. main.run() 被调用,它调用 main.p.setting()main.c.getting()

所以现在,main.p.setting()main.pparameter 值更改为 [1,2,3],而 main.c.setting() 只打印自己的 parameter 值,它仍然是 [],因为它从未被修改过。

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

main = Main()
main.c.setting()
main.run()