如何使用Python的super()来更新父类值?

4 投票
2 回答
5883 浏览
提问于 2025-04-16 16:46

我刚接触继承这个概念,之前关于继承和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”这个引用传给子类呢?

2 个回答

3

这是通过继承来实现的。首先,你有一个叫做Master的父类,然后Sub1和Sub2会从Master继承,成为子类。所有的子类都可以访问父类中的方法和变量。这可能和这个问题重复:如何在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
4

super 这个词只在类继承的情况下使用,也就是说 Sub1Sub2Master 的子类。

在你的例子中,你使用的是包含结构,也就是 Sub1Sub2Master 的属性,这种情况下你不需要用到 super

另外,一般来说,不建议把可变的列表作为类的属性;因为如果你往里面添加东西,会改变这个列表的唯一副本(在类中定义的),而不是每个实例都有自己的副本;应该在 Master.__init__ 方法里初始化这个列表:

class Master(object):
    mydata = None
    def __init__(self):
        self.mydata = []

__init__ 函数是用来设置一个新实例的,通过在这里给 self 赋值一个新的空列表,你可以确保每个实例都有自己独立的副本。

撰写回答