Python / Kivy初始变量赋值

时间:2017-12-04 18:29:21

标签: python kivy

我对Python和OOP比较陌生,并且通过Kivy文档找到了一些我以前不习惯看到的语法。我不确定如何搜索答案,因为我不知道该怎么称为这种语法,所以我将用代码本身来说明。

以下是kivy docs的代码:

import kivy
kivy.require('1.0.5')

from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty


class Controller(FloatLayout):
    '''Create a controller that receives a custom widget from the kv lang file.

    Add an action to be called from the kv lang file.
    '''
    label_wid = ObjectProperty()
    info = StringProperty()

    def do_action(self):
        self.label_wid.text = 'My label after button press'
        self.info = 'New info text'


class ControllerApp(App):

    def build(self):
        return Controller(info='Hello world')


if __name__ == '__main__':
    ControllerApp().run()

上述代码运行时

return Controller(info='Hello world')

我知道它正在为Controller()。info(或kivy.app.build()代码中的controller_object_instance.info设置一个值),但是我不明白这个字符串如何赋值变量'info'因为我认为你需要在类的顶部使用 init ()函数来接受这个赋值。由于Controller()类中没有 init (),为什么不

Controller(info='Hello world')

抛出错误?上面的代码行如何知道将值'Hello world'正确地赋值给它自己的属性'info'?是否有一些继承自App的 init ()函数,这可以使用某人或者它是否与这两行代码有关?

label_wid = ObjectProperty()
info = StringProperty()

任何帮助表示赞赏。只是想找一种方法来自己搜索更多内容,而我仍然坚持要搜索的主题。

1 个答案:

答案 0 :(得分:1)

创建课程Controller时,您希望继承课程FloatLayout 这意味着,无论何时创建Controller对象,都要创建一个扩展的FloatLayout。因此,执行FloatLayout的__init__函数。

看看这个例子:

class Animal:

    def __init__(self,**kwargs):
        self.info = kwargs.get("info")


class Dog(Animal):

    pass


obj = Dog(info="Hello world")

print(obj.info)

现在你要创建一个Dog,但是狗也是Animal,所以你想要继承它的所有方法和属性。
因此,如果您在创建info的实例时将Dog作为参数传递,则会将其传递给Animal的{​​{1}}函数。