Как правильно передавать переменные в классы в python / pyqt? - PullRequest
0 голосов
/ 28 февраля 2019

Представьте, что у меня есть класс 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?

Я уже нашел этот похожий вопрос , хотя я не совсем уверен, как ответ применим к моему вопросу.

1 Ответ

0 голосов
/ 28 февраля 2019

Второй способ 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...