在派生 class 中执行基础 class 覆盖的方法
Executing base class overridden method in derived class
我有一个 PyQt5 应用程序,该应用程序有一个 QToolBox,它由 2 个页面的不同用户界面组成。
所以对于 MainWindow 本身,我创建了一个名为 BPAPOIApp
class 的基础 class 来执行可能直接针对 MainWindow 的任何操作。
并且我创建了另一个派生的 class,它继承了每个 QToolBox 页面的 BPAPOIApp
class,因为每个页面都有单独的操作要完成。
在基地里面class我有一个方法叫做def init_signals
来启动所有与基地相关的动作信号class,同时我想有另一个def init_signals
在两个派生的 classes 中(对于 QToolBox 中的 2 页),这意味着该方法将被覆盖。是否有正确的方法来启动所有 classes(基础和派生)的 init_signals
方法,因为它们都在等待不同的事件发生。
下面是一些相关的代码。
class BPAPOIApp(QWidget):
def __init__(self):
super(BPAPOIApp, self).__init__()
self._widget = QWidget()
self._ui = Ui_Form()
self._widget.setWindowFlag(Qt.FramelessWindowHint)
self._ui.setupUi(self._widget)
self._ui.label.hide()
self.init_signals()
def init_signals(self):
self._ui.close_tbtn.clicked.connect(lambda: self._widget.hide())
self._ui.information.clicked.connect(self.information_display)
self._ui.toolBox.currentChanged.connect(self.reset_info)
def information_display(self):
self._ui.label.setText('Test text')
self._ui.label.show()
以下是BPAApp
class.
class BPAApp(BPAPOIApp):
def __init__(self):
super(BPAApp, self).__init__()
self.init_signals()
def init_signals(self):
super().init_signals() # try to instantiate base class signals here
self._ui.radio_btn1.toggled.connect(self.option_selected)
self._ui.radio_btn2.toggled.connect(self.option_selected)
if __name__ == '__main__':
bpa = BPAApp()
当我触发 information
按钮时 (self._ui.information)
标签没有出现在界面中,这可能是哪里出了问题?
无需在派生 class BPAApp.__init__()
中调用 self.init_signals()
,因为它已在父 class BPAPOIApp.__init__()
中调用。当父级 class 调用它时,MRO 会将其指向最派生的实现,即派生的 BPAApp.init_signals()
(进而调用父级 BPAPOIApp.init_signals()
)。
我有一个 PyQt5 应用程序,该应用程序有一个 QToolBox,它由 2 个页面的不同用户界面组成。
所以对于 MainWindow 本身,我创建了一个名为 BPAPOIApp
class 的基础 class 来执行可能直接针对 MainWindow 的任何操作。
并且我创建了另一个派生的 class,它继承了每个 QToolBox 页面的 BPAPOIApp
class,因为每个页面都有单独的操作要完成。
在基地里面class我有一个方法叫做def init_signals
来启动所有与基地相关的动作信号class,同时我想有另一个def init_signals
在两个派生的 classes 中(对于 QToolBox 中的 2 页),这意味着该方法将被覆盖。是否有正确的方法来启动所有 classes(基础和派生)的 init_signals
方法,因为它们都在等待不同的事件发生。
下面是一些相关的代码。
class BPAPOIApp(QWidget):
def __init__(self):
super(BPAPOIApp, self).__init__()
self._widget = QWidget()
self._ui = Ui_Form()
self._widget.setWindowFlag(Qt.FramelessWindowHint)
self._ui.setupUi(self._widget)
self._ui.label.hide()
self.init_signals()
def init_signals(self):
self._ui.close_tbtn.clicked.connect(lambda: self._widget.hide())
self._ui.information.clicked.connect(self.information_display)
self._ui.toolBox.currentChanged.connect(self.reset_info)
def information_display(self):
self._ui.label.setText('Test text')
self._ui.label.show()
以下是BPAApp
class.
class BPAApp(BPAPOIApp):
def __init__(self):
super(BPAApp, self).__init__()
self.init_signals()
def init_signals(self):
super().init_signals() # try to instantiate base class signals here
self._ui.radio_btn1.toggled.connect(self.option_selected)
self._ui.radio_btn2.toggled.connect(self.option_selected)
if __name__ == '__main__':
bpa = BPAApp()
当我触发 information
按钮时 (self._ui.information)
标签没有出现在界面中,这可能是哪里出了问题?
无需在派生 class BPAApp.__init__()
中调用 self.init_signals()
,因为它已在父 class BPAPOIApp.__init__()
中调用。当父级 class 调用它时,MRO 会将其指向最派生的实现,即派生的 BPAApp.init_signals()
(进而调用父级 BPAPOIApp.init_signals()
)。