2008-11-11 11 views
11

Je n'utilise les classes que depuis peu de temps et quand j'écris une méthode, je fais référence à toutes les variables, par ex. self.foo.Quand le "soi" est-il nécessaire?

Cependant, je regarde le livre wxPython in Action et je remarque que "self" n'est pas utilisé tout le temps. Par exemple:

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) 

La figure ci-dessous utilise "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 je me souviens bien, « moi » est fait référence à une instance particulière de la classe, alors quand est-il pas nécessaire? Y a-t-il une règle générale?

+0

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

+0

Man, comment se fait-il que je ne trouve pas ces questions préalables quand je cherche? C'est comme la 6ème fois que c'est arrivé. Merci pour le lien. – crystalattice

Répondre

8

Vous utilisez self.attribute pour référencer un attribut de votre instance actuelle.

Vous utilisez wx.Frame.__init__() pour référencer une méthode de la classe parente.

Vous n'utilisez pas self si vous faites référence à seulement un nom local (variable) de la méthode (fonction) que vous êtes.

Ce ne sont pas des « règles empiriques », parce qu'il n'y a aucune exception.


Qu'est-ce que vous déroutant probablement dans cet exemple particulier est que le panneau semble être seulement un nom local dans le constructeur, donc il semble que le groupe disparaîtrait, une fois vos déclarations du constructeur.

Si vous regardez la documentation à wx.Panel, cependant, vous verrez que son constructeur attache le panneau à la fenêtre parent, il continuera d'exister, même après le retour du constructeur.

magique :)

+1

+1: Pas de "règles de base". Juste des règles. –

4

Dans ces cas, si vous n'utilisez pas self, vous ne créerez qu'une variable locale de ce nom. Dans le premier exemple, panel est créé en tant que variable locale, puis référencé ultérieurement dans la fonction, mais il ne sera pas disponible en dehors de cette fonction. Le fait de transmettre self au constructeur wx.Panel l'a associé à l'objet courant d'une manière ou d'une autre, de sorte qu'il ne disparaît pas simplement lorsque la fonction revient.

+0

wx.Frame .__ init__ fait référence à la méthode de la classe parente wx.Frame – hop

+0

Pour construire sur ceci, je dirais préférer une variable locale à une variable d'instance (c'est-à-dire ne pas utiliser self) sauf si vous avez vraiment besoin de garder une référence à l'objet pour une utilisation ultérieure dans la classe (par exemple, comme ButtonFrame.OnClick utilise self.button).La réduction de la portée des variables facilite souvent le débogage et la maintenance. –

+0

Okay. Ça a du sens. – crystalattice

0

self est toujours requis lors de la référence à l'instance elle-même, sauf lors de l'appel du constructeur de la classe de base (wx.Frame .__ init__). Toutes les autres variables que vous voyez dans les exemples (panel, basicLabel, basicText, ...) sont juste des variables locales - pas du tout liées à l'objet courant. Ces noms disparaîtront lorsque la méthode reviendra - tout ce qui est mis dans self.foo survivra à la fin de la méthode, et sera disponible dans la méthode suivante (par exemple, self.button).

+0

wx.Frame .__ init__ ne fait pas référence à l'instance, donc ce n'est pas une exception! – hop

Questions connexes