我是继承人的新手,之前关于继承和Python的super()函数的所有讨论都有点过头了。我目前使用以下代码更新父对象的值。
#!/usr/bin/env python
# test.py
class Master(object):
mydata = []
def __init__(self):
s1 = Sub1(self)
s2 = Sub2(self)
class Sub1(object):
def __init__(self,p):
self.p = p
self.p.mydata.append(1)
class Sub2(object):
def __init__(self,p):
self.p = p
self.p.mydata.append(2)
if __name__ == "__main__":
m = Master()
print m.mydata
此命令行返回如下:
user @ host:〜$。/ test.py
[1,2]
有没有更好的方法来使用super()而不是将“self”引用传递给孩子呢?
答案 0 :(得分:3)
super
仅适用于类继承结构,其中Sub1
和Sub2
是Master
的子类。
在您的示例中,您使用了包含结构,Sub1
和Sub2
是Master
的属性,您无法使用super
次调用。
另外,您通常不希望将可变列表用作类属性;附加到它将全局更改列表的一个副本(在类中定义),而不是每个实例;改为使用Master.__init__
方法启动列表:
class Master(object):
mydata = None
def __init__(self):
self.mydata = []
调用__init__
函数来设置一个新实例,并通过在那里为self
分配一个新的空列表,确保每个实例都有自己的副本。
答案 1 :(得分:1)
这是你如何通过继承来做到这一点。首先使用Master作为父类,然后Sub1和Sub2将从Master继承并成为子类。所有子类都可以访问父类中的方法和变量。这可能与以下内容重复:Call a parent class's method from child class in Python?
#!/usr/bin/env python
# test.py
class Master(object):
mydata = []
def __init__(self):
s1 = Sub1()
s2 = Sub2()
class Sub1(Master):
def __init__(self):
super(Sub1, self).mydata.append(1)
class Sub2(Master):
def __init__(self):
super(Sub2, self).mydata.append(2)
if __name__ == "__main__":
m = Master()
print m.mydata