Короткий ответ:
Нет вы не должны использовать супер при определении экрана. Да, у вас всегда есть __init__
с супер (если вы используете __init__
).
Более длинный ответ:
Это ничего уникального для экранов. В примере с документами вы не вызываете __init__
и передаете любые параметры, поэтому нет super
. Вам не нужен звонок __init__
, чтобы определить экран Kivy. Из вопроса SO, если вы используете __init__
, вы пропускаете ** kwargs вверх по иерархии объектов, а также переопределяете __init__
, который обычно запускает инициализацию родительского класса. super
используется для пропуска ** kwargs и запуска родительского __init__
без явного вызова родительского класса, в этом случае Screen
наследует от RelativeLayout
, который сам наследует от FloatLayout
; без супервызов вы переопределяете родительский класс.
Вам не нужно звонить __init__
, если у вас нет необходимости использовать его. Вот Screen
от одного из моих приложений, без __init__
вызова (раскладка устанавливается в файле .kv):
class LoginScreen(Screen):
def login(self):
self.parent.current = 'ParameterScreen'
Вы будете использовать __init__
если вы хотите установить макет, содержание, свойства и т.д. экрана в тот момент, когда вы создаете экземпляр класса, который вы создали, не определяя эти вещи в .kv-файле; для этого вам также понадобится супер, как описано выше. Это хорошая практика в kivy, хотя использовать .kv-файл, когда сможете.
В этом примере я хочу иметь доступ к родительскому дому BottomBar с self.caller, который я передаю как ** kwargs, когда я его создаю, и определите это, как только будет создана строка; поэтому мне нужно определить его в __init__
, который требует супервызов.
class BottomBar(ActionBar):
titletext = StringProperty('')
def __init__(self,**kwargs):
self.caller = kwargs.get('caller')
super(BottomBar,self).__init__(**kwargs)
def change_title(self,newtitle):
self.titletext = newtitle
это значит, если я унаследовать без супер, как в этом примере: https://github.com/kivy/kivy/wiki/Data-driven-variables-with-kivy-properties, я могу модифицировать класс корневого виджета и переменные доступа, которые могут быть созданы в корневом виджете во время выполнения (например, переменные, полученные из объекта pipe)? – Moritz
@Moritz Если вы используете __init__, вы перезаписываете инициализацию по умолчанию, которая вызывается __init__ родительского класса и так далее по иерархии. Вам либо нужен супервызов, либо базовый класс .__ init __() явно указан. С супер вы можете передать параметры родительскому классу. – Daniel