基维屏幕。我必须用超级初始化吗?

Posted

技术标签:

【中文标题】基维屏幕。我必须用超级初始化吗?【英文标题】:kivy screens. Do I have to initialize with super? 【发布时间】:2017-03-13 15:33:41 【问题描述】:

来自docs:

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

来自SO question:

class WelcomeScreen(Screen):
    def __init__(self, **kwargs):
        super(Screen,self).__init__(**kwargs)

什么情况下需要用super初始化屏幕,为什么?

【问题讨论】:

【参考方案1】:

简答:

不,您不必在定义屏幕时使用 super。是的,你总是需要 __init__ 和 super(如果你使用 __init__)。

更长的答案:

这不是屏幕独有的。在文档示例中,您没有调用 __init__ 并传递任何参数,因此不需要 super。您不需要__init__ 调用来定义 Kivy 屏幕。从 SO 问题来看,如果您正在运行 __init__,则您将 **kwargs 向上传递对象层次结构并重新定义 __init__,这通常会运行父类的初始化。 super 用于允许您传递 **kwargs 并运行父 __init__ 而无需显式调用父类,在这种情况下,Screen 继承自 RelativeLayout,而 RelativeLayout 本身继承自 FloatLayout;如果没有 super 调用,您将覆盖父类。

你不需要打电话给__init__,除非你有一些用处。这是来自我的一个应用程序的Screen,没有__init__ 调用(布局在.kv 文件中设置):

class LoginScreen(Screen):
    def login(self):
        self.parent.current = 'ParameterScreen'

如果您想在实例化您创建的类时设置屏幕的布局、内容、属性等,您将使用__init__,而无需在.kv 文件中定义这些内容;为此,您还需要 super 如上所述。在 kivy 中,尽可能使用 .kv 文件是一种很好的做法。

在此示例中,我希望能够使用 self.caller 访问 BottomBar 的父级,我在创建它时将其作为 **kwargs 传入,并在 bar 实例化后立即定义它;所以我需要在__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

【讨论】:

这是否意味着,如果我在这个例子中没有 super 继承:github.com/kivy/kivy/wiki/…,我可以修改根小部件类并访问可能在执行期间在根小部件中生成的变量(例如获得的变量来自管道对象)? @Moritz 如果您使用的是 init,那么您将覆盖默认初始化,它将调用父类的 init,依此类推.您要么需要一个超级调用,要么需要一个明确命名的 BaseClass.__init__()。使用 super 你可以将参数传递给父类。

以上是关于基维屏幕。我必须用超级初始化吗?的主要内容,如果未能解决你的问题,请参考以下文章

基维 |直到程序结束屏幕才会改变

超级快速的 AVPlayer 初始化或如何在后台启动它?

基维外观和感觉

基维。 GridLayout 在 ScrollView 内的位置

在制作反应组件 es6 语法时,为啥用道具超级初始化? [复制]

可以多次调用 viewDidLoad 吗?