需要在Python中明确关于关键字参数

时间:2015-01-05 15:26:18

标签: python oop kwargs

我在这里不清楚:

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

问题:

  1. 这里是self._color变量或字典吗?
  2. 如何在此处获取feet的值?使用print(donald._color['feet'])会导致错误。

2 个答案:

答案 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。它是一个变量。

这里发生了两件有趣的事情。

  1. **方法论证中的kwargs。这意味着您可以调用Duck并传入任何命名参数,例如Duck(color='red')Duck(name='Scrooge')Duck(sound='quack')。该信息将暂时插入字典kwarg中。如果我要做的话
  2. scrooge = Duck(name='Scrooge', sound='quack', color='red')

    然后kwarg看起来像{'name':'Scrooge', 'sound':'quack', 'color':'red'},请在print kwargs方法中插入__init__,亲眼看看。

    1. kwarg.get('color', 'white')询问是否使用命名参数Duck调用了color='something'。如果是这样,那东西会被分配给self._color。如果kwargs没有'颜色'关键,那么'白色'用作默认值并分配给self._color。这将询问dict是否具有键x,如果是,则返回相关值,如果不是则返回此默认值y'是dictionary.get(x, y)所做的。
    2. Q2。脚的价值丢失了。 Duck在实例化对象时接受该值,但在intiallization期间不对其执行任何操作,因此它未被指定为donald的成员变量。当kwarg方法结束时,局部变量__init__消失,只有分配给self.xxx的内容仍然存在。