【问题标题】:How can I use Python's super() to update a parent value?如何使用 Python 的 super() 更新父值?
【发布时间】:2011-05-01 14:55:32
【问题描述】:

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

【问题讨论】:

  • 您是否打算使 mydata 成为类级别的可变对象?代码运行后,Master.mydata[1, 2]
  • 这里没有继承,只有组合。

标签: python inheritance super


【解决方案1】:

super 仅适用于类继承结构,其中Sub1Sub2Master 的子类。

在您的示例中,您使用了包含结构,Sub1Sub2Master 的属性,并且您没有使用 super 调用。

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

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

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

【讨论】:

    【解决方案2】:

    以下是通过继承来实现的方法。您首先拥有作为父类的 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
    

    【讨论】:

    • +1,您只需要删除传递给子类的self
    • 使用super() 访问这样的数据属性确实没有任何意义,即使它们是类属性。你可以使用self.mydata.append(1)
    • 谢谢 Ancide 和 Gustav。这正是我一直在寻找的。仅供参考,我阅读了您可能的重复,但代码是零散的,我无法让它工作。 @Martijn:是的,在这种情况下,我的意图是让 mydata 成为类级别的可变对象,尽管我承认在许多情况下它是不可取的。谢谢。
    猜你喜欢
    • 2018-09-18
    • 2018-05-27
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多