我一直在使用类,当我编写一个方法时,我将所有变量引用为self,例如self.foo.
但是,我正在查看wxPython in Action一书,并注意到"self"并未一直使用.例如:
import wx class TextFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, 'Text Entry Example', size=(300, 100)) panel = wx.Panel(self, -1) basicLabel = wx.StaticText(panel, -1, "Basic Control:") basicText = wx.TextCtrl(panel, -1, "I've entered some text!", size=(175, -1)) basicText.SetInsertionPoint(0) pwdLabel = wx.StaticText(panel, -1, "Password:") pwdText = wx.TextCtrl(panel, -1, "password", size=(175, -1), style=wx.TE_PASSWORD) sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText]) panel.SetSizer(sizer)
下面的一个确实使用"自我".
import wx class ButtonFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, 'Button Example', size=(300, 100)) panel = wx.Panel(self, -1) self.button = wx.Button(panel, -1, "Hello", pos=(50, 20)) self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) self.button.SetDefault() def OnClick(self, event): self.button.SetLabel("Clicked")
如果我没记错的话,"self"是指类的特定实例,那么什么时候没必要呢?有一般的经验法则吗?
您self.attribute
用来引用当前实例的属性.
您wx.Frame.__init__()
用来引用父类的方法.
self
如果您只引用您所在方法(函数)的本地名称(变量),则不使用.
这些不是"经验法则",因为没有例外.
在这个特定的例子中,你可能会感到困惑的是,面板似乎只是构造函数中的本地名称,因此一旦构造函数返回,面板就会消失.
但是,如果您查看文档wx.Panel
,您将看到它的构造函数将面板附加到父窗口,因此即使在构造函数返回后它也将继续存在.
魔法 :)