2010-02-20 4 views
0

Je cette superclasse:Comment réparer l'erreur sur ce code Python?

importation WX

class Plugin(wx.Panel): 
    def __init__(self, parent, *args, **kwargs): 
     wx.Panel.__init__(self, parent, *args, **kwargs) 
     self.colorOver = ((89,89,89)) 
     self.colorLeave = ((110,110,110)) 
     self.SetBackgroundColour(self.colorLeave) 
     self.SetForegroundColour(self.colorLeave) 
     self.name = "plugin" 

     wx.StaticText(self, -1, self.getName(), style=wx.ALIGN_LEFT) 


     self.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver) 
     self.Bind(wx.EVT_LEAVE_WINDOW, self.onMouseLeave) 

    def onMouseOver(self, event): 
     self.SetBackgroundColour(self.colorOver) 
     self.Refresh() 

    def onMouseLeave(self, event): 
     self.SetBackgroundColour(self.colorLeave) 
     self.Refresh() 

    def OnClose(self, event): 
     self.Close() 
     app.Destroy() 

    def getName(self): 
     return self.name 

et cette sous-classe:

import plugin 
import wx 

class noisePlugin(plugin.Plugin): 
    self.name = "noise" 

et il me donne cette erreur de compilation de la sous-classe:

Traceback (most recent call last): 
    File "C:\Users\André Ferreira\Desktop\Tese\Código Python\SoundLog\Plugins\noisePlugin.py", line 4, in <module> 
    class noisePlugin(plugin.Plugin): 
    File "C:\Users\André Ferreira\Desktop\Tese\Código Python\SoundLog\Plugins\noisePlugin.py", line 5, in noisePlugin 
    self.name = "noise" 
NameError: name 'self' is not defined 

Que peut Je fais pour corriger cette erreur? Je veux que la méthode getName() retourne le nom de la classe instanciée!

Merci à l'avance :)

Répondre

3

sous-classe font de la

class noisePlugin(plugin.Plugin): 
    def __init__(self, *a, **k): 
     plugin.Plugin.__init__(self, *a, **k) 
     self.name = "noise" 

Chaque fois que vous voulez utiliser self. quelque chose que vous devez être dans une méthode, pas au niveau de la classe en dehors des méthodes!

+0

merci m8 :) c'était exactement ça! –

+0

@aF, heureux d'avoir été utile! -) –

0

Qu'est-ce qui vous fait penser que cela fonctionne?

class noisePlugin(plugin.Plugin): 
    self.name = "noise" 

Pourquoi ne pas copier le

class Plugin(wx.Panel): 
    def __init__(self, parent, *args, **kwargs): 

qui vient avant self.name=?

0

Pour le modèle que vous semblent essayer de (où le nom est associé plus avec la classe qu'avec l'instance), ce qui est souvent un meilleur langage à suivre:

class A(object): 
    name = 'parent' 

    def __init__(self, ...): 
     ... etc 

class B(A): 
    name = 'child' 

    def __init__(self, ...): 
     A.__init__(self, ...) 
     ... etc 

Même si l'attribut name est stocké sur la classe plutôt que sur l'instance, vous pouvez y accéder en utilisant self.name dans toutes les instances. Généralement, si vous vous trouvez en train d'assigner un attribut statique (immuable) qui est le même dans toutes les instances d'une classe donnée, vous devriez juste utiliser un attribut de classe statique comme ceci.

Sur un sujet légèrement différent, saviez-vous que tous les widgets wxPython ont déjà un attribut de nom, qui peut être attribué en utilisant l'argument de mot-clé name au moment de l'initialisation, et accessible en utilisant soit GetName() ou (dans les versions récentes de wxPython) la propriété Name? Si vous ne l'attribuez pas, il prendra par défaut une valeur spécifique à la classe assez générique (comme "text" ou "textctrl" pour wx.TextCtrl). En fonction de ce que vous essayez de faire, peut-être vous pouvez simplement l'utiliser à la place de votre propre name et getName(). wxPython lui-même n'utilise pas cette valeur, car il est destiné à être utilisé par le programmeur comme bon vous semble.

Questions connexes