Python 访问派生类中已更改的基类实例属性
我很难理解继承中实例变量的逻辑。 这是我的(简化)代码,带有解释我如何理解其行为的注释:Python 访问派生类中已更改的基类实例属性,python,python-2.7,inheritance,instance-variables,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
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()
获取
打印的是[]
,而不是我预期的[1,2,3]
。为什么会这样?既然Child
与Parent
共享\uuuu init\uuuu
,那么在开始时self.parameter=[]
对两者都是如此,但为什么在调用Child()之后很长一段时间给它赋值时它仍然是[]
?如何更改get
中的self.parameter
值?您不是从Main
中的任何内容继承,而是添加成员变量。你表达的是一种“有”的关系,而不是“是”
要继承,请将Main
定义为:
class Main(Child):
def run(self):
self.setting()
self.getting()
使用当前代码,您可以在调用main\u instance.run()
后检查main\u instance.p.parameter
,并查看[1,2,3]
是否返回。您不是从main
中的任何内容继承,而是添加了成员变量。你表达的是一种“有”的关系,而不是“是”
要继承,请将Main
定义为:
class Main(Child):
def run(self):
self.setting()
self.getting()
使用当前代码,您可以在调用main\u instance.run()
后检查main\u instance.p.parameter
,并查看[1,2,3]
是否返回。让我们来看看代码的执行过程
main
实例是使用main()
创建的
此时,我们有main.p=[]
和main.s=[]
,如main中所定义
调用main.run()
,它调用main.p.setting()
和main.c.get()
因此,现在,main.p.setting()
将main.p
的参数值更改为[1,2,3]
,而main.c.setting()
只打印自己的参数值,该值仍然是[]
,因为它从未被修改过
如果要修改main.c.参数
value,只需调用main.c.设置()
让我们来看看代码的执行情况
main
实例是使用main()
创建的
此时,我们有main.p=[]
和main.s=[]
,如main中所定义
调用main.run()
,它调用main.p.setting()
和main.c.get()
因此,现在,main.p.setting()
将main.p
的参数值更改为[1,2,3]
,而main.c.setting()
只打印自己的参数值,该值仍然是[]
,因为它从未被修改过
如果要修改main.c.参数
value,只需调用main.c.设置()
Python不是Java;不是每件事都必须是一门课。摆脱Main
。Python不是Java;不是每件事都必须是一门课。摆脱Main
。