我对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()
任何帮助表示赞赏。只是想找一种方法来自己搜索更多内容,而我仍然坚持要搜索的主题。
答案 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}}函数。