2008-11-11 26 views
11

He estado utilizando clases por poco tiempo y cuando escribo un método, hago que todas las variables sean referencia propia, p. Ej. self.foo.¿Cuándo se requiere "auto"?

Sin embargo, estoy mirando a través del libro wxPython en acción y observo que "self" no se usa todo el tiempo. Por ejemplo:

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) 

El que sigue utiliza "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") 

Si no recuerdo mal, "auto" hace referencia a un caso particular de la clase, por lo que cuando no es necesario? ¿Hay una regla general?

+0

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

+0

Hombre, ¿cómo es que no puedo encontrar estas preguntas anteriores cuando busco? Esto es como la 6ª vez que sucede. Gracias por el enlace. – crystalattice

Respuesta

8

Utiliza self.attribute para hacer referencia a un atributo de su instancia actual.

Utiliza wx.Frame.__init__() para hacer referencia a un método de la clase principal.

Usted no usa self si solo referencia a un nombre local (variable) del método (función) que se encuentra.

Estos no son "reglas de oro", porque no hay excepciones.


Probablemente lo que se confunde en este ejemplo particular es que el panel parece ser sólo un nombre local en el constructor, lo que parece que el panel desaparecería, una vez que sus declaraciones de constructor.

Si nos fijamos en la documentación a wx.Panel, sin embargo, se verá que su constructor se une el panel de la ventana padre, por lo que seguirá existiendo, incluso después de las declaraciones de constructor.

magia :)

+1

+1: No son "reglas generales". Solo reglas. –

4

En esos casos, si no usa self, solo creará una variable local de ese nombre. En el primer ejemplo, panel se crea como una variable local y luego se hace referencia más adelante en la función, pero no estará disponible fuera de esa función. El hecho de pasar self al constructor de wx.Panel lo asoció con el objeto actual de alguna manera, por lo que no solo desaparece cuando la función regresa.

+0

wx.Frame .__ init__ hace referencia al método de la clase padre wx.Frame – hop

+0

Para construir sobre esto, diría que prefiere una variable local a una variable de instancia (es decir, no use self) a menos que realmente necesite mantener una referencia al objeto para su uso posterior en la clase (por ejemplo, como ButtonFrame.OnClick usa self.button).La minimización del alcance variable a menudo facilita la depuración y el mantenimiento. –

+0

Bien. Eso tiene sentido. – crystalattice

0

auto es siempre se requiere al referirse a la instancia en sí, excepto cuando se llama al constructor de la clase base (wx.Frame .__ init__). Todas las demás variables que ve en los ejemplos (panel, etiqueta básica, texto básico, ...) son solo variables locales, no relacionadas con el objeto actual en absoluto. Estos nombres desaparecerán cuando regrese el método: todo puesto en self.foo sobrevivirá al final del método y estará disponible en el siguiente método (por ejemplo, self.button).

+0

wx.Frame .__ init__ no hace referencia a la instancia, por lo que no es una excepción. – hop