super(ClassName,self)._init_()的用途是什么

8 投票
1 回答
8801 浏览
提问于 2025-04-18 00:38

我有一个看起来像这样的类:

#!/usr/bin/env python
class Foo:
    def __init__(self, x):
        self.x = x
    def bar(self):
        self.bar1_out = self.x + 5
        self.bar2_out = self.x + 1
        return (self.bar1_out,self.bar2_out)
    def qux(self,myvalue = None):
        first, second = myvalue or self.bar()
        return first + 3, second + 6

def main():
    """docstring for main"""
    f = Foo(5)

    mbr_out1, mbr_out2 = f.bar()
    print mbr_out1, "\t", mbr_out2

    mqx_out1, mqx_out2 = f.qux()
    print mqx_out1, "\t", mqx_out2

    qout1, qout2 = f.qux((1))
    print qout1, "\t", qout2

if __name__ == '__main__':
    main()

我看到一些实现建议使用 super

    def __init__(self, x):
        super(Foo,self).__init__()
        self.x = x
    def bar(self)
        #etc.

我有几个问题:

  1. super(Foo,self).__init__() 是干什么用的?
  2. 它和 self.x=x 有什么不同?
  3. 我怎么才能让我的代码用 super() 产生相同的结果?

1 个回答

8

这和 self.x=x 有什么不同呢?

super() 只有在你创建子类的时候才有用:

class Foo(object):
    def __init__(self, x):
        self.x = x

class Bar(Foo):
    def __init__(self, x):
        super(Bar, self).__init__(x)
        self.initial_status = False

Bar__init__ 方法中直接设置 self.x = x 是不如使用 super() 的。

它们的区别在于,Bar 不需要关心 Foo 的具体实现。

如果你决定改变 Foo,让它的 self.x = 2 * x,那么你就不需要同时去改 Bar(而且这两个可能在不同的文件里 - 如果你没意识到这一点,出错的可能性几乎是肯定的)。

在你的例子中,因为你没有创建子类,所以使用 super() 是没有意义的。

撰写回答