2012-12-07 40 views
0
class Example(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(Example, self).__init__(*args, **kwargs) 

     self.InitUI() 

    def InitUI(self):  

     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     viewMenu = wx.Menu() 

     self.shst = viewMenu.Append(wx.ID_ANY, 'Show statubar', 
      'Show Statusbar', kind=wx.ITEM_CHECK) 
... 

我最近開始學習python和wxPython。上面的代碼snipppet是從http://www.zetcode.com/wxpython/menustoolbars/。 我試圖讓我的頭在self.shst變量。爲什麼需要用self關鍵字加前綴?函數體中的Python變量「聲明」

從我讀,自我關鍵字在__init__方法上下文中使用,以「聲明」的實例變量,但筆者在__init__

編輯 在光無SHST聲明你的答案我做了如下試驗:

class Test(object): 
    def __init__(self): 
     self.x = 20 
    def func(self): 
     self.y = 10 
    def getVal(self): 
     return self.y 


def main(): 
    t = Test() 
    print t.getVal() 
    print dir(t) 

if __name__ == '__main__': 
    main() 

我無法在GETVAL()函數來訪問self.y,我沒有看到的Y的輸出目錄(T)。 Test class中的每個函數都不應該self.y可訪問嗎?

回答

1

如果您沒有將shst加上self.,那麼它只是一個局部變量,超出了範圍,在方法退出後被垃圾收集。在分配之前不需要聲明python類/對象成員。

+0

您可以評論我的編輯嗎? –

+1

你還沒有調用't.func()'來創建'y'屬性。 – tehwalrus

+0

啊,我現在明白了。看起來像一個危險的python怪癖,謝謝! –

1

沒有必要在__init__中定義實例變量。它們可以在任何地方定義。 Python是一種動態語言,可以在任何時候向對象添加屬性。

+2

但是,在'__init__'中定義任何使用的變量不是一種好的做法,因爲這樣可以在一個函數中看到該類中使用的所有內部變量? – Alex

+0

@Alex確實,但這並沒有強制執行。 – delnan