запуск __init__ внутри собственного определения - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я изучаю tkinter из учебника sentdex, и мне кажется, что я пишу для запуска __init__ в своем собственном определении, что означает такая строка? Это функция tKinter __init__?

class seaOfBTCapp(tk.Tk):

    def __init__(self,*args,**kwargs)
         tk.Tk.__init__(self,*args,**kwargs)

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Эта строка вызывает метод __init__ вашего родительского класса. Вот что произошло бы, если бы вы не определили свой собственный метод, поэтому, если вы ничего не делаете в вашем __init__, вам, вероятно, следует просто пропустить его и позволить унаследованному методу нормально работать.

Также, вероятно, лучше вызывать super().__init__(*args, **kwargs), чем явно указывать родительский класс (и нужно передать self вручную). Это особенно верно, если вы когда-либо могли использовать этот класс в ситуации, связанной с множественным наследованием, когда явное именование следующего класса, который должен быть вызван, может привести к ошибкам MRO. Если вы только начинаете программировать, не беспокойтесь об этом, множественное наследование - довольно продвинутая топи c (хотя в Python получить правильнее, чем во многих других языках).

2 голосов
/ 24 апреля 2020

Он вызывает конструктор другого класса сам по себе.

Это забавная особенность объектно-ориентированного дизайна python. «Методы экземпляра» - это на самом деле просто методы класса, которые принимают текущий экземпляр в качестве неявного параметра. Фактически вы можете вызывать их как методы класса и явно предоставлять объект:

ex = [1, 2, 3, 4, 5]

# the following are equivalent:
ex.pop(0)         # call the method on the instance, passing it implicitly
list.pop(ex, 0)   # call the method on the class `list`, passing the instance explicitly

Здесь используется то же поведение. Вы берете метод __init__ класса tk.TK и передаете self в качестве "экземпляра". Это необычный, но действительный способ доступа к методам в суперклассе, которые были переопределены в вашем подклассе (например, в конструкторе).

Как и в ответе @ Barmar, лучшим решением является использование super(), которое производит нечто, напоминающее экземпляр суперкласса, который вы затем вызываете __init__ для получения реализации __init__() передачи суперкласса self неявно, как и следовало ожидать.

1 голос
/ 24 апреля 2020

Я думаю, что это эквивалентно более современному:

class seaOfBTCapp(tk.Tk):

    def __init__(self,*args,**kwargs)
         super().__init__(*args,**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...