13

我只使用了一小段时间类,当我编写一个方法时,我让所有变量都引用 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”是对类的特定实例的引用,那么什么时候不需要呢?有一般的经验法则吗?

4

3 回答 3

9

您用于self.attribute引用当前实例的属性。

wx.Frame.__init__()用来引用父类的方法。

self如果您只引用您所在的方法(函数)的本地名称(变量),则不要使用。

这些不是“经验法则”,因为没有例外。


在这个特定示例中,您可能会感到困惑的是,面板似乎只是构造函数中的一个本地名称,因此一旦您的构造函数返回,面板看起来就会消失。

但是,如果您查看文档wx.Panel,您会看到它的构造函数将面板附加到父窗口,因此即使在构造函数返回后它也会继续存在。

魔法 :)

于 2008-11-11T10:42:20.440 回答
4

在这些情况下,如果您不使用,self那么您将只创建该名称的局部变量。在第一个示例中,panel它被创建为局部变量,然后在函数中稍后被引用,但它在该函数之外不可用。传递self给 wx.Panel 构造函数的行为以某种方式将它与当前对象相关联,因此它不会在函数返回时消失。

于 2008-11-11T08:26:41.633 回答
0

引用实例本身时总是需要self ,除非调用基类构造函数 (wx.Frame.__init__)。您在示例中看到的所有其他变量(panel、basicLabel、basicText,...)只是局部变量 - 与当前对象完全无关。当方法返回时,这些名称将消失 - 放入 self.foo 的所有内容都将在方法结束后继续存在,并在下一个方法中可用(例如 self.button)。

于 2008-11-11T08:27:44.610 回答