examples - wxpython python 3
¿Cuándo se requiere "auto"? (3)
He estado usando clases por poco tiempo y cuando escribo un método, hago que todas las variables sean referencia propia, p. Ej. Self.foo.
Sin embargo, estoy mirando el libro wxPython in Action y veo 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 de abajo usa "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 mal no recuerdo, "yo" es una referencia a una instancia particular de la clase, entonces ¿cuándo no es necesario? ¿Hay una regla general?
Utiliza self.attribute
para hacer referencia a un atributo de tu instancia actual.
Utiliza wx.Frame.__init__()
para hacer referencia a un método de la clase padre.
No se usa solo si solo hace referencia a un nombre local (variable) del método (función) en el que se encuentra.
Estas no son "reglas generales", porque no hay excepciones.
Lo que probablemente te confunde en este ejemplo particular es que el panel parece ser solo un nombre local en el constructor, por lo que parece que el panel desaparecería una vez que tu constructor regrese.
Sin embargo, si observa la documentación en wx.Panel
, verá que su constructor conecta el panel a la ventana primaria, por lo que continuará existiendo, incluso después de que el constructor regrese.
Magia :)
En esos casos, si no usa self
, solo creará una variable local de ese nombre. En el primer ejemplo, el panel
se crea como una variable local y luego se hace referencia a él más adelante en la función, pero no estará disponible fuera de esa función. El acto de pasar al constructor wx.Panel lo asoció con el objeto actual de alguna manera, por lo que no solo desaparece cuando la función regresa.
self siempre es necesario cuando se refiere 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).