Python/Kivy初始变量赋值
我对Python和OOP比较陌生,阅读了Kivy文档,发现了一些我不习惯看到的语法。我真的不知道如何搜索答案,因为我不知道如何称呼这种类型的语法,所以我将用代码本身来说明 以下是kivy文档中的代码:Python/Kivy初始变量赋值,python,kivy,Python,Kivy,我对Python和OOP比较陌生,阅读了Kivy文档,发现了一些我不习惯看到的语法。我真的不知道如何搜索答案,因为我不知道如何称呼这种类型的语法,所以我将用代码本身来说明 以下是kivy文档中的代码: import kivy kivy.require('1.0.5') from kivy.uix.floatlayout import FloatLayout from kivy.app import App from kivy.properties import ObjectProperty,
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\u object\u instance.info)设置一个值,但我不明白变量'info'的字符串赋值是如何工作的,因为我认为您需要类顶部的init()函数来接受这个赋值。既然Controller()类中没有init,为什么没有呢
Controller(info='Hello world')
抛出错误?上面这行代码如何正确地将值“Hello world”分配给它自己的属性“info”?是否有一些从应用程序继承的init()函数可以被使用,或者与这两行代码有关
label_wid = ObjectProperty()
info = StringProperty()
谢谢你的帮助。我只是在寻找一种方法来搜索更多关于我自己的信息,我被困在了搜索的主题上 创建类
控制器时,您希望继承类FloatLayout
这意味着,无论何时创建控制器对象,都要创建一个扩展的FloatLayout。因此,执行FloatLayout at的\uuuuu init\uuuu
函数
看看这个例子:
class Animal:
def __init__(self,**kwargs):
self.info = kwargs.get("info")
class Dog(Animal):
pass
obj = Dog(info="Hello world")
print(obj.info)
现在您想要创建一只狗
,但狗也是一种动物
,因此您想要继承它的所有方法和属性。
因此,如果在创建Dog
实例时将info
作为参数传递,它将被传递给Animal
的\uuuuuu初始化
函数。Controller(info='Hello world')
将字符串'Hello world'分配给变量info
。它调用Controller
函数并查找变量info
,将该字符串分配给它。Controller.\uuuuu init\uuuuu
在FloatLayout中定义。\uuuu init\uuuu
,搜索“继承”Controller(variable=value)
构造控制器并从中调用\uuu init\uuu函数<代码>\uuuu init\uuuu
可以根据需要使用它。kivy会“变魔术”,并将值赋给info实例变量。@syntonym我对继承比较熟悉,但我想我对它理解得不够好。因此,当控制器(info='Hello world')将参数info='Hello world'传递给父FloatLayout时,这是否为FloatLayout.Controller.info或FloatLayout.info赋值?还是我认为等级制度完全错了?我在之前的评论中发现我的想法是错误的。执行Controller(info='Hello world')
时,将创建一个Controller实例,该实例继承FloatLayout
中的所有变量,并将字符串“Hello world”分配给变量info
。此变量info
不会通过FloatLayout.Controller.info
或FloatLayout.info
访问,它将只属于新创建的对象,在这个特定代码中,该对象不会在任何地方显示为实例,但该实例将通过build()传递
函数返回到Kivy代码中较高的位置。继续。。。实际上,变量info
将被分配到父类FloatLayout
代码中,或者如果FloatLayout
从处理\uuu init\uuuu()功能的其他类继承而来,则可能被分配到更高的父类中。无论它被分配到哪个父类、grand_父类或gg_父类代码,由于固有性,最终所有的父变量,包括info
都可以通过“Controller(info='Hello world')创建的对象实例访问。我理解这个例子,但是关于变量赋值,我的问题更深入了一点。在本例中,您仅打印传递的关键字。如果相反,Animal.\uuuu init\uuuu()方法将关键字参数分配给局部变量“info”,这会传递给子类Dog吗?还是只能作为动物信息访问?@TopherBuckley更新了答案。如前所述,yes Dog继承了所有动物的属性和方法。感谢您的更新。这基本上回答了我的问题,但考虑得更深入一些,并更新了我对上述问题的评论。谢谢你给我指明了正确的方向!