如何修复此Python代码的错误?

时间:2010-02-20 13:41:53

标签: python wxpython

我有这个超类:

导入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()方法返回instanciated类的名称!

提前致谢:)

3 个答案:

答案 0 :(得分:3)

制作子类

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

每当你想要使用self.某个东西时,你必须在方法中,而不是在方法之外的类级别!

答案 1 :(得分:0)

是什么让你认为这有效?

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

你为什么不复制

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

self.name=之前?

答案 2 :(得分: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?如果您不指定它,它将默认为一些相当通用的特定于类的值(例如"text""textctrl"用于wx.TextCtrl)。根据您的目的,您可以使用它而不是自己的namegetName()。 wxPython本身不会使用这个值,因为程序员可以根据需要使用它。