2013-01-14 2 views
3

Я смотрел на некоторых учебниках для некоторых PyQt4 вещей, и это хорошо, но я не совсем понимаю, почему синтаксис при создании объекта таков:Python - Почему методы вызова во время __init __()

class Example(QtGui.QMainWindow): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):    

     #code to set up instance variables and show() the window 

То, что достигается именно от этого, таким образом, а не только для полного удаления вызова self.initUI() и просто поместить любой код, который устанавливает атрибуты в __init__() после вызова super?

+1

Скорее всего, для удобства чтения и повторного использования. – timc

+1

На многих языках это делается для повторного использования кода между несколькими конструкторами. Это также может быть полезно, если вы хотите повторно инициализировать объект в какой-то момент. –

+0

Или переопределить в подклассе, который не вызывает 'initUI', или вызывает его по-разному. – tripleee

ответ

13

Иногда код разделяется на функции для удобства чтения.

Если ваша инициализация объекта требует трех шагов, то логически было бы разумно разбить ее на три функции. Имена этих функций могут описывать, какую часть инициализации они обрабатывают.

Другая причина, по которой вы можете увидеть функцию «init», вызванную из истинного __init__, - это если эта функция восстанавливает объект в новое состояние; в этом случае вы можете вызвать «чистую» функцию извне __init__, например, в пул объектов.

Вы также указали на третью причину повторного использования в своем собственном вопросе: если подкласс должен изменить порядок, в котором происходят части инициализации (или опустить/заменить некоторые части целиком!), Это невозможно с монолитным __init__, но легко, если он разделен на отдельные части.

Четвертая и последняя причина для профилирования. Если вы отслеживаете записи/существующие функции и тайминги, отдельные функции дают вам более точную детализацию в метриках времени.

Независимо от того, как вы кодекс зависит от вас - но подход, который вы задаете здесь делает имеет достоинства.

+0

Спасибо за четкий ответ. Теперь, когда это объясняется мне, конечно, это делает весь смысл в мире :) –

0

Возможно, так, чтобы initUI можно было вызвать снова.

0

Только одна причина, о которой я знаю, так же, как и большинство языков - удобство использования. Ядром объектно-ориентированного программирования является возможность повторного использования вещей - будь то классы, методы или переменные. Разделив наши различные методы/функции, мы можем их назвать позже. Если вы когда-нибудь будет называть их позже ... это спорно. Я думаю, что это сводится к хорошей практике программирования.

Смежные вопросы