В моем, по общему признанию, ограниченном опыте программирования графического интерфейса OO (в основном с JAVA и Tkinter) я заметил, что в одном коде все виджеты назначаются атрибутам экземпляра, тогда как в другом коде их мало, если таковые имеются.

Например, в простой программе Hello World из главы Tkinter документации python обе кнопки назначаются атрибутам экземпляра класса Application:

class Application(Frame):
    ...

    def createWidgets(self):
        self.QUIT = Button(self)
        ...
        self.hi_there = Button(self)
        ...

    def __init__(self, master=None):
        Frame.__init__(self, master)
        ...
        self.createWidgets()

С другой стороны, глава Dialog Windows книги Tkinter определяет поддержку диалогов класс, в котором ни один из его виджетов не назначен атрибутам экземпляра:

class Dialog(Toplevel):
    def __init__(self, parent, title = None):
        Toplevel.__init__(self, parent)
        ...
        body = Frame(self)
        ...
        self.buttonbox()
        ...
    ...
    def buttonbox(self):
        ...
        box = Frame(self)

        w = Button(box, ...)
        ...
        w = Button(box, ...)
        ...
    ...

Постановка вопроса

Каковы плюсы и минусы каждого подхода, и есть ли ситуации, когда было бы целесообразнее использовать один подход вместо другого?

0
Avi Steiner 29 Авг 2011 в 23:41

2 ответа

Лучший ответ

Мое практическое правило простое: если вам понадобится ссылаться на него позже, сделайте его атрибутом. Если нет, не надо.

Я не уверен, что могу перечислить какие-либо плюсы и минусы этого подхода - ни сохранение всех ссылок, ни сохранение только тех, которые вам нужны, - это особенно хорошо или плохо, это в основном вопрос стиля.

При этом, однако, создание атрибута для виджета может означать, что он используется где-то еще. Если он не используется где-либо еще, люди могут сделать выводы о вашем коде, которые не соответствуют действительности.

1
Bryan Oakley 29 Авг 2011 в 21:41

Во многих случаях вам не нужно будет ссылаться на виджет после того, как вы добавите его в окно и соедините его с событиями; в этих случаях виджет не будет считаться атрибутом. Кроме того, если контейнер является динамическим, вы не должны делать виджет атрибутом (поскольку вы заранее не знаете, какие виджеты будут у объекта).

Если контейнер является статическим и вы знаете, что вам понадобится ссылаться на виджет позже, вы можете сделать его атрибутом объекта; это сделает ссылки на виджет в других частях класса ясными и компактными.

0
antlersoft 29 Авг 2011 в 19:50