在派生 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]
。为什么会这样?由于 Child
与 Parent
共享 __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]
。
让我们执行您的代码。
main
实例是用 Main()
创建的。
此时我们有 main.p = []
和 main.s = []
,如 Main.__init__
中所定义
main.run()
被调用,它调用 main.p.setting()
和 main.c.getting()
所以现在,main.p.setting()
将 main.p
的 parameter
值更改为 [1,2,3]
,而 main.c.setting()
只打印自己的 parameter
值,它仍然是 []
,因为它从未被修改过。
如果要修改main.c.parameter
值,只需调用main.c.setting()
main = Main()
main.c.setting()
main.run()
我很难理解继承中实例变量的逻辑。 这是我的(简化的)代码,注释解释了我如何理解它的行为:
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
与 Parent
共享 __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]
。
让我们执行您的代码。
main
实例是用Main()
创建的。
此时我们有 main.p = []
和 main.s = []
,如 Main.__init__
main.run()
被调用,它调用main.p.setting()
和main.c.getting()
所以现在,main.p.setting()
将 main.p
的 parameter
值更改为 [1,2,3]
,而 main.c.setting()
只打印自己的 parameter
值,它仍然是 []
,因为它从未被修改过。
如果要修改main.c.parameter
值,只需调用main.c.setting()
main = Main()
main.c.setting()
main.run()