2013-03-20 54 views
0

我想知道是否有人有任何快速解釋如何有效地和pythonically用可選參數創建用戶定義的對象的好方法。 舉例來說,我想創建該對象:python類的初始化程序中的可選參數

class Object: 
    def __init__(self, some_other_object, i, *j, *k): 
     self.some_other_object = some_other_object 
     self.i = i 
     # If j is specified, assume it is = i 
     if(j==None): 
      self.j = i 
     else: 
      self.j = j 
     # If k is given, assume 0 
     if(k==None): 
      self.k = 0 
     else: 
      self.k = k 

有沒有更好的方式來做到這一點?

編輯:我改變了代碼,使它更廣泛,更容易理解。

+1

這是無效的,你不能有多個'*'參數。以'*'爲前綴的參數成爲所有非關鍵字參數的*列表* *。 – 2013-03-20 22:12:48

+0

感謝@Lattyware,這有助於。我看到* args和* keywordsargs等,並認爲它們可能指的是通過了不同的參數。 – chase 2013-03-20 22:17:20

+0

毒素的答案是你想要的,它只是有一個主要缺陷(見我對它的評論)。 – 2013-03-20 22:17:52

回答

3

您可以設置默認參數:

class OpticalTransition(object): 
    def __init__(self, chemical, i, j=None, k=0) 
     self.chemical = chemical 
     self.i = i 
     self.k = k 
     self.j = j if j is not None else i 

如果不顯式調用類jk,它會使用這些默認值。

創建對象時,可以使用全部四個參數:OpticalTransition('sodium', 5, 100, 27)。如果要使用j的默認值,但不使用k,則仍可以通過引用參數名稱OpticalTransition('sodium', 5, k=27)來完成此操作。

+2

*一般來說,不要擔心,如果x == None,只是如果x。*是不好的建議。許多值可以計算爲「False」 - 如果你想檢查'None',則執行'如果x是None:',而不是'if x:'。在這個例子中,如果'j'爲'0',它會做出意想不到的事情。 -1,直到這是固定的。 – 2013-03-20 22:14:48

+0

你說得對 - 我想OP是這麼做的,看看它是否存在,不一定要看它們是否具有「無」的價值。 – toxotes 2013-03-20 22:18:20

+0

解決這個問題,我會將其翻轉+1,這是除此之外可能的最佳答案。 (編輯:我自己編輯)。 – 2013-03-20 22:18:57

0

你可以傳遞args作爲一個字典對象,並通過字典來解析,以得到你想要的。如果它沒有通過,get函數將返回None並且可以像那樣檢查存在。

class Optioncal_transition(object): 
    def __init(self, **args): 
    self.chemical = args.get('chemical') 
    self.i = args.get('i') 
    self.j = args.get('j') 
    if self.j is None: 
     self.j = self.i 
+1

這大大地重塑了車輪 - 存在默認參數。 -1。這隻會讓你的代碼變得不可讀。 – 2013-03-20 22:16:55