2010-02-20 111 views
0

我有這個超:如何修復此Python代碼中的錯誤?

進口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 

和這個子類:

import plugin 
import wx 

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

,這讓我這個錯誤編譯子類:

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 

能有什麼我確實解決了這個錯誤? 我想讓getName()方法返回實例化類的名字!

感謝提前:)

回答

3

讓子類

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

每當你想使用self.的東西,你必須的方法內,而不是在一流水平的方法之外!

+0

謝謝m8 :)這是確切的! –

+0

@aF,很高興有幫助! - ) –

0

是什麼讓你想這樣的作品?

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

你爲什麼沒有複製

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

self.name=之前來?

0

有關模式你似乎在試圖爲(其中名字更與類不是與實例相關聯),這往往是一個更好的成語遵循:

class A(object): 
    name = 'parent' 

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

class B(A): 
    name = 'child' 

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

即使name屬性存儲在類而不是實例上,您可以在所有實例中使用self.name來訪問它。一般來說,如果你發現自己在給定類的所有實例中分配一個靜態(不變)屬性,你應該只使用這樣的靜態類屬性。

在一個稍微不同的主題,你意識到所有的wxPython部件已經有了一個name屬性,可以使用在初始化時name關鍵字參數進行分配,並使用或者GetName()或(在最新版本的wxPython的)的訪問物業Name?如果您不指定它,它將默認爲一些相當通用的特定於類的值(如wx.TextCtrl的"text""textctrl")。根據你想要做什麼,也許你可以使用它而不是你自己的namegetName()。 wxPython本身並沒有使用這個值,因爲它適合程序員在你認爲合適的時候使用。