2012-06-11 81 views
5

我有這樣的代碼:Python的初始化

def __init__(self, a, b, c, d...): 
    self.a = a 
    self.b = b 
    etc 

我想用替換它:

def __init__(self, a, b, c, d...): 
    args=locals() 
    for key in args: 
    self.__dict__[key] = args[key] 

這是一個壞主意?有沒有更好的方法來做到這一點?

+1

可能要小心自我的說法,但在其他看起來不錯 – lxop

+0

將輸入的數量變化,或者是有定數? – HodofHod

+0

謝謝Ixop, 輸入的數量不會改變。 –

回答

2

大廈@ ThiefMaster的評論關於**kwargs

如果你在20個參數服用,它可能會更有意義,要求用戶通過關鍵字來代替位置發送參數:有20個參數,有一個體面有人使用你的代碼會得到錯誤順序的參數。

考慮只有接受kwargs,同時有一個預定義的密鑰列表你想接受和引發ValueError如果你沒有收到它們。所以你可以使用**kwargs然後檢查一切都在那裏。例如。

INITIAL_ARGS = set(['a','b','c','d','e'...]) 

def __init__(self, **kwargs): 
    if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())): 
     raise ValueError("Class <myclass> requires 20 keyword arguments" 
          "only given %d" % len(kwargs)) 
    self.__dict__.update(kwargs) 

不知道這是否是多還是比你原來少了Python的,但它似乎將節省大量的時間以後試圖找出爲什麼有人使用你的代碼可能會得到奇怪的錯誤時。

+0

如果OP在每次調用中都要求相同數量的參數(在評論中說過),我會用'=='而不是'issubset' - 不希望用戶添加其他隨機關鍵字參數不要做任何事情,但會污染命名空間! – weronika

9

Zen of Python簡單勝於複雜。可讀性計數。

顯式賦值比使用魔法設置值更具可讀性和簡單性。

+1

+1不需要混淆 – Levon

+0

事情是有大約20個這樣的變量;明確的任務仍然更好? 並通過顯式賦值,你的意思是「self.a = a」等? –

+2

接受20個變量的方法聽起來很糟糕。你有沒有考慮過接受'** kwargs'並做'self .__ dict __。update(kwargs)'? – ThiefMaster

1

總是考慮巧妙設計的可讀性。替換代碼是否易於閱讀?我可能會離開它。請記住,簡單比複雜更好。正如ThiefMaster所說,明確的任務更具可讀性。

0

Python3用戶的另一種替代方法:init來自drastic的裝飾器。

@init 
def __init__(self, a, b, c, d, e, f, g, h): 
    # nothing to write here!