English 中文(简体)
“自我” 何时需要?
原标题:
  • 时间:2008-11-11 08:24:00
  •  标签:

我才刚开始使用类,当我编写一个方法时,我让所有的变量都引用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)

下面的一个确实使用了 "self"。

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

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


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

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

魔法 :)

问题回答

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

自我(self)在引用实例自身时始终是必需的,除非调用基类构造函数(wx.Frame.__init__)。在示例中看到的所有其他变量(面板,基本标签,基本文本等)都只是局部变量-与当前对象无关。当方法返回时,这些名称将消失-放入self.foo的所有内容将在方法结束后存活,并在下一个方法中可用(例如self.button)。





相关问题
热门标签