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

    Дополню к другому ответу примером. Вот это все практически одно и то же:
    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-м Питоне.
    Ответ написан
    2 комментария
  • Что обозначает этот простой код?

    GavriKos
    @GavriKos
    Вызывает __init__ родительского класса, который судя по всему - Frame.
    Ответ написан
    Комментировать
  • Что обозначает этот простой код?

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