Классы Python: Наследование и инстанцирование

Я создаю GUIclass, который использует Frame () в качестве базового класса.

В моем методе init GUIclass я хочу создать виджет Frame

Прямо сейчас у меня есть:

class GUIclass(Frame): def __init__(self, parent): frame = Frame(self, parent) 

Но я видел это в другом месте для третьей строки:

 Frame.__init__(self, parent) 

Я новичок в программировании, python и определенном наследовании, и я хотел знать, правильно ли я понимаю разницу между ними. Я обещал много исследований и чтения, но я не мог найти ничего, что сделало бы его совершенно ясным:

В первой ситуации я не вызываю метод init, так как я создал объект Frame (frame), и когда объект создается, его метод init неявно называется python.

Во втором сценарии один вызывает метод init в классе (который, я считаю, полностью легитим?), Потому что объект Frame не был создан, поэтому он не будет делать это автоматически.

Это правильно?

Я также видел:

 frame = Frame.__init__(self, parent) 

который действительно меня отбросил. Это просто кто-то делает что-то лишнее или есть причина для этого?

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

2 Solutions collect form web for “Классы Python: Наследование и инстанцирование”

Вы должны позвонить

 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 приведет к удвоенному вызову метода __init__() , Обычно это не предназначено, и чтобы позаботиться о том, чтобы этого не произошло, super вызов был изобретен. Позаботится о том, чтобы достойный вызов вызывал каждый из методов __init__() только один раз.

Вы должны будете использовать Frame.__init__(self, parent) поскольку Tkinter не поддерживает суперзвонки

  • Проверка диапазона Tkinter Spinbox
  • Попытка получить значение из шкалы Tkinter и поместить его в ярлык
  • python ImageTk.PhotoImage - segfault
  • Как отключить ручное изменение размера столбца дерева Tkinter?
  • Создание новых ящиков ввода с кнопкой Tkinter
  • TKinter RadioButton не работает
  • Как получить текст метки Tkinter?
  • Какая магия предотвращает блокировку программ Tkinter в интерактивной оболочке?
  • Python - лучший язык программирования в мире.