Python __初始化值与实例化值
我是python和kivy的新手,我对变量实例化的理解一直停留在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
\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
传递给keytext
时,它将作为一对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)