代码之家  ›  专栏  ›  技术社区  ›  crystalattice

什么时候需要“自我”?

  •  12
  • crystalattice  · 技术社区  · 16 年前

    我使用类的时间很短,当我编写一个方法时,我让所有变量引用self,例如self.foo。

    但是,我正在查看 Wxpython正在运行 预订并注意“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”是指类的一个特定实例,那么什么时候不需要呢?有一般的经验法则吗?

    3 回复  |  直到 16 年前
        1
  •  8
  •   user3850    16 年前

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

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

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

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


    在这个特定的示例中,可能会让您感到困惑的是,面板似乎只是构造函数中的一个本地名称,所以当您的构造函数返回时,面板似乎会消失。

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

    魔术:

        2
  •  4
  •   Greg Hewgill    16 年前

    在这些情况下,如果不使用 self 然后您将只创建该名称的局部变量。在第一个例子中, panel 是作为局部变量创建的,然后在后面的函数中引用,但在该函数之外它将不可用。过路的行为 自己 以某种方式将它与当前对象关联到wx.panel构造函数,因此它不会在函数返回时消失。

        3
  •  0
  •   Martin v. Löwis    16 年前

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