我无法理解继承中实例变量的逻辑。 这是我的(简化)代码,其中的注释解释了我如何理解其行为:
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
值?
答案 0 :(得分:1)
让我们执行您的代码。
main
实例是使用Main()
创建的。此时我们main.p = []
和main.s = []
已定义为Main.__init__
main.run()
被调用,并调用main.p.setting()
和main.c.getting()
现在,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]
。