2016-10-04 46 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)