Как я могу исправить ошибку в этом коде Python? - PullRequest
0 голосов
/ 20 февраля 2010

У меня есть этот суперкласс:

импорт 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 ]

3 голосов
/ 20 февраля 2010

Сделать подкласс

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

Когда вы хотите использовать self. что-то, вы должны быть внутри метода , а не на уровне класса вне методов!

0 голосов
/ 20 февраля 2010

Для шаблона, который вы, похоже, пытаетесь использовать (где имя связано больше с классом, чем с экземпляром), часто лучше придерживаться этой идиомы:

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 не использует это значение, так как он предназначен для вас, чтобы программист использовал его по своему усмотрению.

0 голосов
/ 20 февраля 2010

Что заставляет вас думать, что это работает?

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

Почему вы не скопировали

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

Что предшествует self.name=?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...