Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Kivy初始变量赋值_Python_Kivy - Fatal编程技术网

Python/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,

我对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, 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继承了所有动物的属性和方法。感谢您的更新。这基本上回答了我的问题,但考虑得更深入一些,并更新了我对上述问题的评论。谢谢你给我指明了正确的方向!