在python/pyqt中,向类传递变量的正确方法是什么?

在python/pyqt中,向类传递变量的正确方法是什么?,python,class,pyqt,Python,Class,Pyqt,假设我有一个GUI类,它的主要功能是处理程序的图形表示,但它也存储信息并链接不同的操作。举个例子: import sys from PyQt5.QtWidgets import QWidget, QPushButton, QGridLayout, QApplication class MainWindow(QWidget): def __init__(self): super().__init__() self.button_a = QPushButto

假设我有一个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中存储的所有信息。但另一方面,如果我只单独传递每个变量,我最终会传递一长串看起来很麻烦的事情。还是只参考主窗口的实例更好


我已经找到了答案,但我不太确定答案如何适用于我的问题。

第二种方法
ObjectClassB
更好,因为它尊重对象封装。 为了减少参数的数量,可以使用,如本例所示

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']

第二种方法
ObjectClassB
更好,因为它尊重对象封装。 为了减少参数的数量,可以使用,如本例所示

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']

您可能还想复制变量您可能还想复制变量我看,谢谢您的建议!对象封装意味着什么?简短的定义:封装是OOP的基础之一。它是指将数据与对该数据进行操作的方法捆绑在一起。封装用于将结构化数据对象的值或状态隐藏在类中,防止未经授权的方直接访问它们。类(所谓的getter和setter)中通常提供可公开访问的方法来访问值,其他客户机类调用这些方法来检索和修改对象中的值。更多信息:啊,我想这是有道理的。有趣的是,我自己已经为我的一些类编写了getter和setter程序(虽然不是所有的类,所以不是超级一致的),因为我看到它在库中使用。我想知道为什么你不只是通过简单的名字来访问/编辑变量。我明白了,谢谢你的建议!对象封装意味着什么?简短的定义:封装是OOP的基础之一。它是指将数据与对该数据进行操作的方法捆绑在一起。封装用于将结构化数据对象的值或状态隐藏在类中,防止未经授权的方直接访问它们。类(所谓的getter和setter)中通常提供可公开访问的方法来访问值,其他客户机类调用这些方法来检索和修改对象中的值。更多信息:啊,我想这是有道理的。有趣的是,我自己已经为我的一些类编写了getter和setter程序(虽然不是所有的类,所以不是超级一致的),因为我看到它在库中使用。我想知道为什么不通过简单地调用变量名来访问/编辑变量。