Когда требуется «я»? - PullRequest
12 голосов
/ 11 ноября 2008

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

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

Ответы [ 3 ]

8 голосов
/ 11 ноября 2008

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

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

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

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


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

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

Магия:)

4 голосов
/ 11 ноября 2008

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

0 голосов
/ 11 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...