Когда требуется "я"?
Я использую классы всего лишь короткое время, и когда я пишу метод, я делаю все переменные ссылкой 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).