2012-12-07 128 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