4

我是继承新手,之前关于继承和 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”引用传递给孩子?

4

2 回答 2

4

super仅适用于类继承结构,其中Sub1Sub2Master.

在您的示例中,您使用包含结构,Sub1并且Sub2是 的属性Master,并且您对super调用没有用处。

此外,您通常真的不想使用可变列表作为类属性。附加到它将全局更改列表的一份副本(在类中定义),而不是每个实例;而是在Master.__init__方法中启动列表:

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

调用该__init__函数来设置一个新实例,并通过为其分配一个新的空列表self,您可以确保每个实例都有自己的副本。

于 2011-05-01T15:03:09.583 回答
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
于 2011-05-01T15:04:08.290 回答