想象一下,我有GUI类,其主要功能是处理程序的图形表示,但也存储信息和链接不同的操作。例如,像这样的事情:
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QGridLayout, QApplication
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.button_a = QPushButton('button_a')
self.button_b = QPushButton('button_b')
self.button_c = QPushButton('button_c')
self.layout = QGridLayout()
self.layout.addWidget(self.button_a, 0, 0)
self.layout.addWidget(self.button_b, 1, 0)
self.layout.addWidget(self.button_c, 2, 0)
self.setLayout(self.layout)
self.variable_a = 1
self.variable_b = 2
self.variable_c = 3
self.object_a = None
self.object_b = None
self.object_c = None
self.button_a.clicked.connect(self.do_something)
self.button_b.clicked.connect(self.do_something_else)
self.button_c.clicked.connect(self.do_something_entirely_different)
def do_something(self):
self.object_a = ObjectClassA(self)
def do_something_else(self):
self.object_b = ObjectClassB(
self.variable_a, self.variable_b, self.variable_c
)
def do_something_entirely_different(self):
self.object_c = ObjectClassC()
class ObjectClassA:
def __init__(self, gui):
self.variable_a = gui.variable_a
self.variable_b = gui.variable_b
self.variable_c = gui.variable_c
class ObjectClassB:
def __init__(self, variable_a, variable_b, variable_c):
self.variable_a = variable_a
self.variable_b = variable_b
self.variable_c = variable_c
class ObjectClassC:
def __init__(self):
self.variable_a = GUI.variable_a
self.variable_b = GUI.variable_b
self.variable_c = GUI.variable_c
if __name__ == '__main__':
app = QApplication(sys.argv)
GUI = MainWindow()
GUI.show()
sys.exit(app.exec_())
这是哪种方法?我看到如果你传递整个MainWindow类,ObjectClassA的新实例基本上可以访问存储在MainWindow中的所有信息。但另一方面,如果我只是单独传递每个变量,我最终可能会传递一长串看起来很麻烦的东西。或者只是简单地引用MainWindow的实例?
我已经找到了this similar question,虽然我不太确定答案如何适用于我的问题。
第二种方式ObjectClassB
更好,因为它尊重对象封装。为了减少参数的数量,您可以使用dictionaries,就像这个例子一样。
def do_something_else(self):
args = {'a':self.variable_a, 'b':self.variable_b, 'c':self.variable_c}
self.object_b = ObjectClassB(args)
class ObjectClassB:
def __init__(self, mydict):
self.variable_a = mydict['a']
self.variable_b = mydict['b']
self.variable_c = mydict['c']