super(ClassName,self)._init_()的用途是什么
我有一个看起来像这样的类:
#!/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.
我有几个问题:
super(Foo,self).__init__()
是干什么用的?- 它和
self.x=x
有什么不同? - 我怎么才能让我的代码用
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()
是没有意义的。