我在这里不清楚:
class Duck:
def __init__(self,**kwargs):
self._color=kwargs.get('color','white')
def main():
donald=Duck(feet=2)
print(donald._color) #it will print white
问题:
self._color
变量或字典吗?feet
的值?使用print(donald._color['feet'])
会导致错误。答案 0 :(得分:1)
kwargs
字典是__init__
方法中的局部变量,它是一个字典。你在代码中大多忽略了它,当方法结束时,字典会再次被丢弃。
您对字典执行的唯一操作是在给定键的情况下从中检索一个值,如果该键不存在,则替换默认值。 kwargs.get('color', 'white')
返回'white'
,因为'color'
密钥不存在。因此,self._color
绑定到字符串'white'
,而不是字典。
请注意,术语变量是另一种引用名称的方式,例如kwargs
是一个变量。根据您的要求,变量也可以引用Python对象上的属性,因此self._color
是一个变量,无论您使用它来引用什么。 'white'
是一个字符串对象,但您也可以为其指定字典。
您的代码永远不会查找其他密钥,因此'feet'
中的kwargs
密钥会被忽视,并会被kwargs
字典再次丢弃。
如果您想对feet
执行任何操作,那么您必须从字典中检索 。例如:
if 'feet' in kwargs:
self._feet = kwargs['feet']
如果给出了关键字参数,则仅设置self._feet
。如果未传入feet
关键字参数,则永远不会设置_feet
属性。
您可以改为给它一个默认值;通过设置具有相同名称的类属性(如果实例没有_feet
属性,则使用它),或者使用相同的dict.get()
方法返回而是默认值。
答案 1 :(得分:1)
Q1。它是一个变量。
这里发生了两件有趣的事情。
Duck
并传入任何命名参数,例如Duck(color='red')
,Duck(name='Scrooge')
,Duck(sound='quack')
。该信息将暂时插入字典kwarg
中。如果我要做的话 scrooge = Duck(name='Scrooge', sound='quack', color='red')
然后kwarg
看起来像{'name':'Scrooge', 'sound':'quack', 'color':'red'}
,请在print kwargs
方法中插入__init__
,亲眼看看。
kwarg.get('color', 'white')
询问是否使用命名参数Duck
调用了color='something'
。如果是这样,那东西会被分配给self._color。如果kwargs没有'颜色'关键,那么'白色'用作默认值并分配给self._color
。这将询问dict是否具有键x,如果是,则返回相关值,如果不是则返回此默认值y'是dictionary.get(x, y)
所做的。 Q2。脚的价值丢失了。 Duck
在实例化对象时接受该值,但在intiallization期间不对其执行任何操作,因此它未被指定为donald
的成员变量。当kwarg
方法结束时,局部变量__init__
消失,只有分配给self.xxx
的内容仍然存在。