【问题标题】:What is the use of super(ClassName,self)._init_() [duplicate]super(ClassName,self)._init_() 有什么用[重复]
【发布时间】:2014-05-10 10:21:30
【问题描述】:

我有一个如下所示的课程:

#!/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() 使上面的代码产生相同的结果

【问题讨论】:

标签: python class oop


【解决方案1】:

它与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(),因为您没有子类化。

【讨论】:

  • 谢谢。如何使用super 重新实现我的初始代码并查看它的效果?
  • @neversaint 我刚刚看到你没有继承任何东西......我会重写我的答案。
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 2012-08-03
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多