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

10 浏览
0 Comments

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

这个问题已经有了答案

理解Python中带有__init__()方法的super() [重复]

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

#!/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()使我的代码在上例中产生相同的结果?
admin 更改状态以发布 2023年5月23日
0
0 Comments

它与 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 更好。

区别在于 Bar 不需要关心 Foo 的实现。

如果你选择以一种将 self.x = 2 * x 设定为默认的方式更改 Foo,那么你就不必同时更改 Bar(它甚至可以位于不同的文件中——几乎保证会有人看不到这一点)。

在你的例子中,没有使用 super() 的意义,因为你没有对它进行子类化。

0