我一直在使用类很短的时间,当我编写一个方法时,我将所有变量引用为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”是指类的特定实例,那么什么时候没必要呢?有一般的经验法则吗?
答案 0 :(得分:8)
您使用self.attribute
来引用当前实例的属性。
您使用wx.Frame.__init__()
来引用父类的方法。
如果您只引用所在方法(函数)的本地名称(变量),则不使用self
。
这些不是“经验法则”,因为没有例外。
在这个特定示例中,您可能会感到困惑的是,面板似乎只是构造函数中的本地名称,因此一旦构造函数返回,面板就会消失。
但是,如果查看wx.Panel
的文档,您会看到其构造函数将面板附加到父窗口,因此它将继续存在,即使在构造函数之后也是如此回报。
魔术:)
答案 1 :(得分:4)
在这些情况下,如果您不使用self
,那么您将只创建该名称的局部变量。在第一个示例中,panel
被创建为局部变量,然后在函数中稍后引用,但在该函数之外将不可用。将self
传递给wx.Panel构造函数的行为以某种方式将其与当前对象相关联,因此当函数返回时它不会消失。
答案 2 :(得分:0)
self在引用实例本身时需要始终。您在示例中看到的所有其他变量(panel,basicLabel,basicText,...)只是局部变量 - 根本不与当前对象相关。当方法返回时,这些名称将消失 - 放入self.foo的所有内容将在方法结束时存活,并在下一个方法中可用(例如self.button)。