在另一个类中使用类变量

2 投票
1 回答
2425 浏览
提问于 2025-04-16 10:55

大家好,

我现在正在用Python和wxPython开发一个应用程序。在这个应用里,有一个对话框,里面有几个字段,用来把一个“文档”插入到数据库中。这个对话框的布局基本上是一个wx.Notebook,里面有几个“标签页”,每个标签页里都有一些字段。

# Dialog class
class NovoRegisto(wx.Dialog):
    def __init__(self,parent):
        wx.Dialog.__init__(self, parent, title='Registar Nova O.T.', size=(900,600))

        painel = wx.ScrolledWindow(self, -1, style=wx.VSCROLL|wx.HSCROLL)
        painel.SetScrollbars(0,30,0,500)
        notebook = wx.Notebook(painel)

        # create the page windows as children of the notebook
        pag1 = InfoOT(notebook)
        pag2 = Avaliacao(notebook)
        pag3 = Componentes(notebook)
        pag4 = Material(notebook)
        pag5 = OTsRelacionadas(notebook)

                          <...>
        # function to insert data in SQLite database
        def OnRegister(self,event):
                          <...>

# first tab class
class InfoOT(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

                          <...>

正如你们所看到的,我为对话框本身创建了一个类(这个类的定义是通过一个“注册”按钮来控制的),然后为每个标签页又创建了不同的类。

现在,为了把数据提交到数据库,我需要在“OnRegister”这个定义里访问“标签页”的变量(这个定义属于对话框的类)。不过,我还没找到办法做到这一点。

有没有人能帮我一下?我需要改变我程序的结构吗?我这样做是因为这是我唯一能让笔记本正常工作的方式……

提前谢谢大家

1 个回答

3

你的“tabs”并不是类变量,而是函数 __init__ 内部的局部变量。而且你其实不需要类变量,你需要的是实例变量。要读取和写入实例变量,你需要通过 self 来访问它们,比如 self.pag1,而不是直接写它们的名字。

你需要区分以下几种变量:

  • 函数局部变量 - 在函数内部定义的变量
  • 类变量 - 通过属性操作符访问的类属性(比如 NovoRegisto.variable_name
  • 实例变量 - 通过 self 使用属性操作符访问的实例属性(比如 self.pag1)。

你可能需要多了解一下如何使用 Python 类

另外,你通常会想使用

super(InfoOT, self).__init__(parent)

而不是

wx.Panel.__init__(self, parent)

这个在新式类中可用(也就是所有直接或间接继承自内置 object 的类)。

撰写回答