__init__值vs实例化值

时间:2014-06-27 07:01:29

标签: python python-3.x kivy

我是python和kivy的新手,我坚持使用变量实例化的__init__,我的代码如下:

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文本正在运行的类。

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

3 个答案:

答案 0 :(得分:2)

当您将值id传递给键text时,它将作为一对键:值存储在词典kwargs__init__

因此,您可以访问 1

kwargs['text']

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

self.text = kwargs.get('text', 'X')

,而不是引发异常,将返回默认值。


1:这是获取与字典中的键对应的值的语法。如果密钥不存在于字典中,则会引发错误。

答案 1 :(得分:1)

def __init__(self, **kwargs): # kwargs is a dict containing text
    '''
    Constructor
    '''
    super(spot,self).__init__(**kwargs)
    self.ismine=False
    self.text=kwargs['text'] # you need to assign it here

答案 2 :(得分:0)

对于Python来说,其他答案在一般意义上是正确的,但它们并不能解释Kivy特别发生的事情。

textStringProperty课程的Button。这意味着只要您调用超类构造函数,就不需要在构造函数中赋值,因为Kivy会自动处理Kivy properties的赋值。

例如:

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文档的Properties部分。您可能会发现Events部分也很有用。

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

class TestWidget(Widget):
    prop = StringProperty('default text')

对于继承的属性(例如Button text):

class TestButton(Button):
    def __init__(self, **kwargs):
        kwargs.setdefault('text', 'default text')
        super(TestButton, self).__init__(**kwargs)