Ответ 1
Вы должны позвонить
super(GUIclass, self).__init__(parent)
Это правильный способ вызова (всего) вашего унаследованного метода (ов) __init__()
. Во многих случаях это идентичные результаты по сравнению с указанными
Frame.__init__(self, parent)
которому не хватает абстракции относительно отношений наследования и объявляет класс Frame
как единственный и единственный класс, метод __init__()
, который вы могли бы вызвать (подробнее об этом позже).
Также упоминается
frame = Frame(self.parent)
неверно в этом контексте. Он относится к другому шаблону отношения к объекту, а именно к отношениям содержимого вместо отношения наследования (к которому вы стремитесь). Он создаст новый объект класса Frame
вместо инициализации частей Frame
самостоятельно; в отношениях наследования вы Frame
, поэтому вам нужно инициализировать yourself
как один, а также инициализировать ваши специализированные части (что делается в остальной части вашего метода __init__()
). В моделях отношения содержания вы просто имеете Frame
.
Теперь, как насчет этой "небольшой" разницы, о которой я говорил выше, между вызовами super(GUIclass, self).__init__(parent)
и Frame.__init__(self, parent)
?
Чтобы понять, что вам нужно углубиться в отношения наследования и различные возможности, которые они предлагают, особенно с множественным наследованием.
Рассмотрим модель отношения ромбовидной формы, которая выглядит так:
Frame
/ \
GUIclass SomeOtherClass
\ /
AnotherClass
В вашем текущем сценарии у вас есть только верхние левые два класса, но никто не знает, что произойдет, и вы всегда должны кодировать таким образом, чтобы следующий пользователь вашего кода сохранял все параметры.
В этом ромбовидном шаблоне у вас есть AnotherClass
, который наследует GUIClass
и SomeOtherClass
, которые, в свою очередь, наследуют Frame
.
Если теперь использовать шаблон Frame.__init__(self, parent)
как в GUIClass
, так и SomeOtherClass
, то вызов их методов __init__()
из метода __init__()
AnotherClass
приведет к удвоенному вызову Frame
__init__()
. Обычно это не предназначено, и чтобы заботиться о том, чтобы этого не произошло, был вызван вызов super
. Он позаботится о том, чтобы достойный порядок вызова вызывал каждый из методов __init__()
только один раз.