@onlooked

Что обозначает этот простой код?

Изучаю питон. Вот есть простая реализация GUI и кнопкой при помощи ООП. Не могу понять что обозначает эта строка.
from tkinter import*
class Application(Frame):
	def __init__(self, master):
		super(Application, self).__init__(master)    #что делает эта строка, для чего она????? Разжуйте, пожалуйста.
		self.grid()
		self.create_widgets()
	def create_widgets(self):
		self.bttn = Button(self, text = '111')
		self.bttn.grid()
		
		
root = Tk()
root.title('Buttons')
root.geometry('200x85')

app = Application(root)

root.mainloop()
  • Вопрос задан
  • 2802 просмотра
Решения вопроса 2
@abcd0x00
Объяснение

Когда делаешь
class Application(Frame):
то Application - это твой самодельный класс, который делается из существующего класса Frame.

Это значит, что все объекты (экземпляры) класса Application будут двух типов одновременно - типа Application и типа Frame.

Когда делаешь
def __init__(self, master):
это значит, что ты у класса Application делаешь метод __init__. При этом у класса Frame есть свой собственный метод __init__. Эти методы могут полностью различаться.

Когда делаешь
app = Application(root)
ты создаёшь объект (экземпляр) класса Application. При этом ему в метод __init__ передаётся основное окно всей программы.

app имеет сразу два типа - самодельный Application (который ты сам сделал) и существующий Frame (который уже сделали до тебя). По правилам tkinter'а, когда ты создаёшь какое-нибудь окно, его надо прилеплять к основному (так можно давать команды сразу всему дереву окон, в котором одни окна прилеплены к другим, и всё это прилеплено к основному окну).

Так вот, чтобы было всё правильно, твой самодельный объект, который сделан из существущего оконного типа, нужно прилепить к основному окну. Но так как твой объект - самодельный и сам по себе окном не является, то внутри себя он должен обратиться к тому типу, который делает его окном, и передать ему основное окно программы, чтобы тот мог к нему прилепиться.

Понимаешь, у тебя app - это один объект как бы двух типов: один тип не делает ничего, в нём есть только свой __init__ и ещё там какой-то самодельный метод; а другой тип является окном со всеми методами и свойствами окна.
Поэтому, чтобы в своём самодельном типе что-то делать, ты обращается просто к его элементам. А чтобы в существующем типе что-то делать, ты к нему получаешь доступ через super() (от слова суперкласс), а потом обращаешься к своим же элементам но через методы другого типа.

Поэтому запись
super(Application, self).__init__(master)
Означает, что нужно взять метод __init__ у базового класса Frame и передать в него аргумент master, переданный в __init__ производного класса Application.
Функция super() как бы отыскивает базовый класс у класса Application и возвращает его, а дальше уже идёт обращение к методу __init__ этого найденного класса.
Ответ написан
Комментировать
GavriKos
@GavriKos
Вызывает __init__ родительского класса, который судя по всему - Frame.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Дополню к другому ответу примером. Вот это все практически одно и то же:
class Ancestor(object):
    def method(self):
        print("Hello from", self)

class Descendant(Ancestor):
    def __init__(self):
        super(Descendant, self).method()

class Descendant2(Ancestor):
    def __init__(self):
        super().method()

class Descendant3(Ancestor):
    def __init__(self):
        Ancestor.method(self)

d = Descendant()
d2 = Descendant2()
d3 = Descendant3()

Hello from <__main__.Descendant object at 0x00F2FAD0>
Hello from <__main__.Descendant2 object at 0x00F2FB70>
Hello from <__main__.Descendant3 object at 0x00F2FB50>


upd: Второй вариант (super без аргументов) работает только в 3-м Питоне.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы