2016-10-04 47 views
-1

我的问题的第一部分是我如何访问类的预设默认参数以将它们的值用作其他参数?我想要做的是这样的:在初始时Python访问默认参数

class C: 

    def __init__(self, size_hint = (0, 0), **kwargs): 
     self.size_hint = size_hint 

,然后制作一个实例:

>>> c=C(x = self.size_hint) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'self' is not defined 

但在初始化时selfC也不得而知。

第二个问题是在上面的类定义中,我如何设置kwargs字典中的键值作为实例属性? 我知道这并不工作,但我的意思是这样的:

for k, v in kwargs.items(): 
    self.k = v 
+1

我仍然不完全确定你在第一种情况下要做什么。 –

+0

@学生,你能澄清你的第二个问题吗?为什么你的代码不工作? – skovorodkin

+0

@skovorodkin如果我把'for'循环放在'__init__'中并且像'c = C(x =“C()。X”)那样实例化类''''x的值将被存储在'k'中属性,而不是在'x'中。调用'c.x'会引发'AttributeError:'C'对象没有属性'x'',调用'c.k'给出'C()。X“。 – amirteymuri

回答

0

这里回答你的第一个问题(使用inspect.signature):

import inspect 

class C: 
    def __init__(self, size_hint = (0, 0), **kwargs): 
     self.size_hint = size_hint 


assert inspect.signature(C.__init__).parameters['size_hint'].default == (0, 0) 

有一个更简单的方式来获得默认参数值,但它不会让你通过参数的名字,让他们,如果你不使用唯一的关键字参数:

assert C.__init__.__defaults__ == ((0, 0),) 

而且答案秒ond问题:

for k, v in kwargs.items(): 
    setattr(self, k, v)