2014-03-31 19 views
4

我有一個類,看起來像這樣:什麼用超(類名,個體經營)._ 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. 

一些實現我的問題是:

  1. 什麼用的super(Foo,self).__init__()
  2. 它是如何從self.x=x
  3. 不同我怎樣才能讓我的代碼頂部上方產生使用super()
+0

也許這有助於:http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods – skamsie

回答

3

它是如何從不同self.x=x同樣的結果?

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的執行情況。

如果你選擇在這臺self.x = 2 * x辦法改變Foo,那麼你不會有改變Bar以及(甚至可能坐在一個差異文件 - 未能看到這幾乎可以保證)。

在你的例子中,沒有一點使用super(),因爲你沒有子類。

+0

謝謝。我如何用'super'重新實現我的初始代碼並查看它的效果? – neversaint

+1

@neversaint我剛剛看到你不會繼承任何東西......我會重寫我的答案。 – glglgl

相關問題