2011-07-14 55 views
0

我有一個類是誰_ 初始化 _函數需要相當多的關鍵字參數。我希望能夠基本上重寫這段代碼,使它在語法上更清晰(不太硬編碼)。最好我想能夠得到它,這樣簡單地增加一個關鍵字參數_ 初始化 _將分別更改所有屬性/參數的空函數。以Pythonic的方式處理大量的關鍵字參數

class Class : 

    def __init__ (self, kw0=0, kw1=1, kw2=2) : 

     ''' The keyword arguments as strings. ''' 
     self.Keys = ['kw0', 'kw1', 'kw2'] 

     ''' Their values. ''' 
     self.Values = [kw0, kw1, kw2] 

     ''' A dictionary made from the keys and values. ''' 
     self.Dict = self.make_dict() 

     ''' As individual attributes, ''' 
     self.KW0, self.KW1, self.KW2 = self.Values 

    def make_dict (self) : 
     ''' Makes a dictionary ''' 

     keys = self.Keys 
     values = self.Values 

     _dict = {} 
     for i in xrange(len(keys)) : 
      key = keys[i] 
      value = values[i] 

      _dict[key] = value 

     return _dict 

    def null (self, kw0=None, kw1=None, kw2=None) : 
     ''' The same keyword arguments as **__init__** but they all default 
      to **None**. ''' 

     pass 

c = Class() 
print c.Keys 
print c.Values 
print c.Dict 
print c.KW0 
print c.KW1 
print c.KW2 

回答

2

爲什麼不接受任何關鍵字參數。您可以使用允許的關鍵字名稱及其默認值的類屬性。

class Class(object): 

    _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!") 

    def __init__(self, **kwargs): 

     # Raise exception if any non-supported keywords supplied 
     if set(kwargs.keys()) - set(self._defaults.keys()): 
      raise KeyError("unsupported keyword argument") 

     # Update our instance with defaults, then keyword args 
     self.__dict__.update(self._defaults) 
     self.__dict__.update(kwargs) 

如果你想在一個以上的方法(例如__init__()null())則剛剛突破參數處理代碼伸到自己的方法,並從兩地調用它相同的功能。

一個缺點是,help()和其他Python文檔工具將不會顯示允許關鍵字參數,因爲它們不是在你的方法簽名。

順便說一句,我不明白爲什麼你獨立存儲密鑰和值。只需將它們存儲爲字典,然後拿到鑰匙或值,當您使用字典的.keys().values()方法希望他們。

+0

哇,這是一個很棒的代碼他們,謝謝! – rectangletangle

3

這是我喜歡python的一件事。在你__init__

def __init__ (self, **kwargs): 
    self.__dict__.update(kwargs) 

將追加在字典kwargs作爲類的成員定義的那些成員。

編輯 - 以反映** kwargs))正確的語法,和更新(而不是追加(

+0

另外['defaultdict'](http://docs.python.org/release/3.1.3/library/collections.html#collections.defaultdict),或Python版本低於2.5的'defaultdict'配方。哦,@serotonin:你忘了在前面加上''**'之前在函數定義kwargs',以便值可以作爲'在函數調用的keyword = value'雙輸入,而不是通過一個實際的' dict'。 – JAB

+1

默認值在哪裏? – Gerrat

+0

這對我的作品2.6 – dwerner

相關問題