Классы 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?
  • TKinter оставляет границы вокруг виджетов
  • Виджет кнопки не уничтожается при попытке удалить из сетки
  • ImportError: нет модуля с именем _imagingtk
  • Как обновить изображение виджета Tkinter Label?
  • Переключение между двумя кадрами в tkinter
  • Tkinter снимает нечетность с pyHook
  • Вертикальный текст в холсте Tkinter
  • Как мне сфокусироваться на текстовый виджет Python Tkinter?
  • Класс Python: глобальное / локальное имя переменной не определено
  • UnicodeWarning: специальные символы в Tkinter
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.