Python __初始化值与实例化值

Python __初始化值与实例化值,python,python-3.x,kivy,Python,Python 3.x,Kivy,我是python和kivy的新手,我对变量实例化的理解一直停留在\uuuu init\uuuu上,我的代码如下: from kivy.uix.button import Button from kivy.uix.gridlayout import GridLayout from kivy.uix.boxlayout import BoxLayout spots={} class spot(Button): ''' classdocs ''' def __ini

我是python和kivy的新手,我对变量实例化的理解一直停留在
\uuuu init\uuuu
上,我的代码如下:

from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout

spots={}

class spot(Button):
    '''
    classdocs
    '''
    def __init__(self, **kwargs):
        '''
        Constructor
        '''
        super(spot,self).__init__(**kwargs)
        self.ismine=False
        self.text="X"

class game(BoxLayout):        

    def attachtogrid(self):
        self.m.clear_widgets()
        spots.clear()
        for r in range(0,25):
            for c in range(0,25):
                id=str(r)+","+str(c)
                spots[id]=id
                self.m.add_widget(spot(text=id)) 
我的问题是,尽管我将id值传递给text属性(代码的最后一行),但我仍然将“X”作为文本,这是spot类中的默认值;如果我删除默认文本 (self.text=“X”)ID文本正在工作


请澄清上述默认值和实例化差异。多谢各位

当您将值
id
传递给key
text
时,它将作为一对key:value存储在
\uuu init\uuu
中的字典

因此,您可以作为1访问它

但是,如果用户没有传递参数
text
,则上面的行(尝试访问键
text
)将引发
KeyError
,因为该键不存在。为了解决此问题,您可以使用
dictionary.get(key,default)
方法:

self.text = kwargs.get('text', 'X')
它将返回默认值,而不是引发异常



1:这是获取字典中键对应的值的语法。如果字典中不存在该键,则会出现错误。

其他答案在Python的一般意义上是正确的,但它们没有解释Kivy会发生什么

text
是课堂上的一个主题。这意味着只要调用超类构造函数,就不需要在构造函数中赋值,因为赋值是由Kivy自动处理的

例如:

In [1]: from kivy.uix.button import Button

In [2]: class TestButton(Button):
   ...:     def __init__(self, **kwargs):
   ...:         super(TestButton, self).__init__(**kwargs)
   ...:         

In [3]: test = TestButton(text='hi')

In [4]: test.text
Out[4]: 'hi'
您也可以使用自己的属性执行此操作:

In [1]: from kivy.uix.widget import Widget

In [2]: from kivy.properties import StringProperty, BooleanProperty, NumericProperty

In [3]: class TestWidget(Widget):
   ...:     name = StringProperty()
   ...:     num = NumericProperty()
   ...:     active = BooleanProperty()
   ...:     

In [4]: test = TestWidget(name='testing', num=12, active=True)

In [5]: test.name, test.num, test.active
Out[5]: ('testing', 12, True)
(当然,请记住,如果没有构造函数,将自动调用超类构造函数。)

有关更多信息,请参阅Kivy文档的一节。您可能会发现该部分也很有用

如果您自己创建了属性,则可以设置默认值,如下所示:

class TestWidget(Widget):
    prop = StringProperty('default text')
对于继承的属性(如
text
):


@当您调用带有参数和/或关键字的函数时,将显示SUPPAVAN。分别执行*args和**kwargs时,参数将转换为列表,关键字参数将转换为dict。如果您有一个默认值:
self.text=kwargs.get('text',X')
@glglglglgl您是对的。我没有注意到问题中有一个默认值。编辑。这对我不起作用。自定义小部件的init方法不存在新属性的默认值。例如,对于ListProperty,返回[],而不是定义的默认值。@wackazong它们应该是。请注意,以kv为单位设置的值与设置默认值不同。啊,这就是混淆。为了便于记录,如果需要获取KV文件值,则需要一个延迟初始化方法,如下所述:
In [1]: from kivy.uix.widget import Widget

In [2]: from kivy.properties import StringProperty, BooleanProperty, NumericProperty

In [3]: class TestWidget(Widget):
   ...:     name = StringProperty()
   ...:     num = NumericProperty()
   ...:     active = BooleanProperty()
   ...:     

In [4]: test = TestWidget(name='testing', num=12, active=True)

In [5]: test.name, test.num, test.active
Out[5]: ('testing', 12, True)
class TestWidget(Widget):
    prop = StringProperty('default text')
class TestButton(Button):
    def __init__(self, **kwargs):
        kwargs.setdefault('text', 'default text')
        super(TestButton, self).__init__(**kwargs)