super(Class Name,self)的用途是什么.__ init __()

时间:2014-03-31 07:08:42

标签: python class oop

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

#!/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. 的内容
  3. self.x=x
  4. 有何不同
  5. 如何使用super()
  6. 使我的代码在上面生成相同的结果

1 个答案:

答案 0 :(得分:5)

  

它与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

比在self.x = x的{​​{1}}设置Bar更好。

不同之处在于__init__无需关心Bar的实施。

如果您选择以设置Foo的方式更改Foo,那么您也不必更改self.x = 2 * x(它甚至可能位于差异文件中 - 失败看到这几乎可以保证。)

在您的示例中,没有必要使用Bar,因为您没有子类。