Когда требуется "я"?

Я использую классы всего лишь короткое время, и когда я пишу метод, я делаю все переменные ссылкой self, например. self.foo.

Однако я просматриваю wxPython в книге действий и замечаю, что "я" не используется все время. Например:

 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")

Если я правильно помню, "я" - это ссылка на конкретный экземпляр класса, поэтому, когда это не нужно? Есть общее правило?

Ответ 1

Вы используете self.attribute для ссылки на атрибут вашего текущего экземпляра.

Вы используете wx.Frame.__init__() для ссылки на метод родительского класса.

Вы не используете self, если ссылаетесь только на локальное имя (переменную) метода (функции), в котором вы находитесь.

Это не "эмпирические правила", потому что исключений нет.


Что, вероятно, смущает вас в этом конкретном примере, так это то, что панель, кажется, является только локальным именем в конструкторе, поэтому похоже, что панель исчезнет, ​​как только ваш конструктор вернется.

Если вы посмотрите на документацию на wx.Panel, вы увидите, что ее конструктор присоединяет панель к родительскому окну, поэтому она будет продолжать существовать даже после возврата конструктора.

Магия:)

Ответ 2

В этих случаях, если вы не используете self, тогда вы создадите только локальную переменную этого имени. В первом примере panel создается как локальная переменная, а затем упоминается позже в функции, но она не будет доступна вне этой функции. Акт передачи self в конструктор wx.Panel каким-то образом связал его с текущим объектом, поэтому он не просто исчезает, когда возвращается функция.

Ответ 3

self всегда требуется при обращении к самому экземпляру, кроме случаев, когда вы вызываете конструктор базового класса (wx.Frame.__ init__). Все остальные переменные, которые вы видите в примерах (panel, basicLabel, basicText,...), являются только локальными переменными, которые вообще не связаны с текущим объектом. Эти имена исчезнут, когда метод вернется - все, что помещено в self.foo, выдержит конец метода и будет доступно в следующем методе (например, self.button).