我有这个超类:
导入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类的名称!
提前致谢:)
答案 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)。根据您的目的,您可以使用它而不是自己的name
和getName()
。 wxPython本身不会使用这个值,因为程序员可以根据需要使用它。