【问题标题】:Access changed base class instance attribute in derived class访问派生类中更改的基类实例属性
【发布时间】:2018-03-21 23:03:46
【问题描述】:

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

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 = [] 两者都是,但是为什么在Child().__init__ 被调用很久之后它仍然是[]?我应该怎么做才能更改getting 中的self.parameter 值?

【问题讨论】:

  • Python 不是 Java;并非所有东西都必须是一个类。摆脱Main

标签: python python-2.7 inheritance instance-variables


【解决方案1】:

让我们来看看你的代码的执行。

  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()

【讨论】:

    【解决方案2】:

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

    要继承,请像这样定义Main

    class Main(Child):
    
        def run(self):
            self.setting()
            self.getting()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多