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

    @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__ этого найденного класса.
    Ответ написан
    Комментировать