【问题标题】:Splitting python class into multiple files将python类拆分为多个文件
【发布时间】:2016-05-05 17:38:38
【问题描述】:

我想知道是否有人能告诉我是否可以将以下代码分成两个 python 类,然后将它们放在两个不同的文件中:

from GUI import mainGUI
from GUI import subwindowGUI

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

        # mainGUI contains QMdiarea in which it opens
        # a subwindow by calling a function MySubWin(self)

        # QMdiarea name is 'body'

        self.OpenSub.triggered.connect(self.MySubWin)

    def MySubWin(self):
        self.MySubWin = QWidget()
        self.MySubWin.setObjectName('Module window')

        self.myTabs = QtabWidget(self.MySubWin)
        self.myTabs.setObjectName('myTabs')

        # now I call the function that will display
        # the gui elements inside this 'Module window'
        self.create_module_gui()

        self.body.addSubWindow(self.MySubWin)
        self.MySubWin.showNormal()

    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)

从上面的代码可以看出,我的函数正在与主窗口 gui 元素进行交互。我想将与此特定模块相关的这些功能移动到一个单独的文件中以进行维护。这就是为什么我要求你帮助我实现这一目标,如果可能的话。提前致谢,Tomislav。

@梅尔:

如果我将这些函数移到另一个文件中:

myFunctions.py

class MyFunctions(object):

    def MySubWin(self):
        self.MySubWin = QWidget()
        self.MySubWin.setObjectName('Module window')

        self.myTabs = QtabWidget(self.MySubWin)
        self.myTabs.setObjectName('myTabs')

        # now I call the function that will display
        # the gui elements inside this 'Module window'
        self.create_module_gui()

        self.body.addSubWindow(self.MySubWin)
        self.MySubWin.showNormal()

    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)

然后我将该文件导入到我的主文件中。

import myFunctions

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

        # mainGUI contains QMdiarea in which it opens
        # a subwindow by calling a function MySubWin(self)

        # QMdiarea name is 'body'

        self.OpenSub.triggered.connect(MyFunctions.MySubWin)

我最终得到的错误是 MyFunctions 对象没有属性主体。

【问题讨论】:

  • 您已经在使用GUI 进行操作:代码在不同的文件中,您在开头导入它然后使用它。您可以对任何代码执行相同的操作。

标签: class python-3.x module pyqt5


【解决方案1】:

第一,我必须说你不会从中获得任何维护......但是例如让我们将 create_module_gui 移动到另一个类

在一个新文件中:creategui.py

class CreateGUI(object):
   
    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)

在您的代码中:

from GUI import mainGUI
from GUI import subwindowGUI
from creategui import CreateGUI

class MyApp(QMainWindow, mainGUI.Ui_MainWindow, CreateGUI):
     #yay you have your create_module_gui method now...

现在您也可以将 create_module_gui 作为函数放在另一个文件中,并以 self 作为第一个参数调用它...

【讨论】:

  • 非常感谢 Yoav。它就像一个魅力!就现在的维护而言,维护我的模块对我来说会容易得多,因为我可以将每个模块放在单独的文件中。在 100 行代码中查找错误比在 1000 多行代码中查找错误要容易得多。再次非常感谢。
  • @Beller0ph0n - 没问题,请注意最好根据 SRP 进行拆分,而不仅仅是代码行
  • 我同意你的看法。您能否就 SRP 原则(教程或文档)提出一些指导或建议。在此先感谢 Yoav。
  • Single-responsibility principle。类似于 Unix 哲学:Do One Thing and Do It Well。但只有你知道你的程序:)
【解决方案2】:

查看此解决方案:https://stackoverflow.com/a/47562412/10155767

在你的情况下,不要在myFunctions.py 中上课。相反,在顶层定义函数。因此myFunctions.py 应该是这样的:

def MySubWin(self):
    ...

def create_module_gui(self, *args):
    ...

然后在你的原始文件中,导入类中的函数

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    from myFunctions import MySubWin, create_module_gui

    def __init__(self, parent=None):
        ...

【讨论】:

  • 保持缩进的技巧:if True: ...。保留缩进有助于减少差异噪音,尤其是在为其他人的项目做出贡献时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多