在派生类中访问已更改的基类实例属性
问题描述:
我无法理解继承中实例变量的逻辑。 这是我(简化)代码注释解释我是如何理解它的行为:在派生类中访问已更改的基类实例属性
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
值?
答
让我们来执行您的代码。
-
main
实例使用Main()
创建。
在这个时刻,我们有main.p = []
和main.s = []
,如Main.__init__
-
main.run()
被调用,它调用main.p.setting()
和main.c.getting()
所以现在,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]
。
Python是不是Java;不是每件事都必须是一个阶级。摆脱'Main'。 – chepner