2008-11-11 2 views
11

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

Тем не менее, я смотрю на wxPython in Action и замечаем, что «я» не используется все время. Например:

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

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

+0

Dupe: http://stackoverflow.com/questions/68282/why-do-you-need-explicitly-have-the-self-argument-into-a-python-method – 2008-11-11 14:32:13

+0

Человек, почему я не могу найти эти предыдущие вопросы, когда я ищу? Это похоже на шестой раз, когда это произошло. Спасибо за ссылку. – crystalattice 2008-11-12 03:25:16

ответ

8

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

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

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

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


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

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

Волшебное :)

4

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

+0

wx.Frame .__ init__ ссылается на метод родительского класса wx.Frame – hop 2008-11-11 10:40:13

+0

Чтобы использовать это, я бы предпочел использовать локальную переменную переменной экземпляра (т. Е. Не использовать self), если вам действительно не нужно поддерживать ссылку к объекту для последующего использования в классе (например, ButtonFrame.OnClick использует self.button).Сведение к минимуму объема переменных часто облегчает отладку и обслуживание. – 2008-11-11 10:57:28

0

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

Смежные вопросы