python - 基维屏幕。我必须用 super 初始化吗?

标签 python kivy super

来自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初始化屏幕,为什么?

最佳答案

简答:

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

更长的答案:

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

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

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

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

在这个例子中,我希望能够使用 self.caller 访问 BottomBar 的父级,我在创建它时将其作为 **kwargs 传入,并在栏被实例化后立即定义它;所以我需要在 __init__ 中定义它,这需要一个 super 调用。

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

关于python - 基维屏幕。我必须用 super 初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344081/

相关文章:

python - 熟悉 SQLAlchemy 的最简单方法/最佳教程是什么?

Kivy:TextInput 边框半径

java - Java 中的“this”和 'super' 关键字用法

python - 使用带有哨兵对象的默认参数的 Sphinx python 方法进行记录?

python - Django UpdateView 的内联表单集

android - kivy buildozer 虚拟机

python - 使用 __init__() 方法理解 Python super()

python - 这段代码是在哪个类中定义的?

python - 如何在 pox Controller 中检查数据包类型是 tcp syn 还是 rst

python - 在 Pycharm (Mac) 中设置 Kivy