2017-04-22 13 views
1

我寫一個名爲 「袋」 一個簡單的Python類:如何在Python中創建「可選」參數?

class Bag: 
def __init__(self, items=None): 
    if self.items == None: 
     self.items = defaultdict() 
    else: 
     temp_dict = defaultdict() 
     for key in self.items: 
      temp_dict[key] += 1 
     self.items = temp_dict 

變量項目發生在對象的列表,如:

['d','a','b','d','c','b','d'] 

從那裏,「高清__init __(自,項=無)」將:

  1. 初始化作爲空defaultdict,如果沒有被傳遞到項目,或
  2. 初始化傳入的參數,如果對象的列表被傳遞到項目

例如,這應該工作:

b = Bag() 

缺少一個參數的要細,爲被設置,默認情況下,到_None

然而,這總是會引發異常(從檢查錯誤的腳本):

*Error: b = Bag() raised exception AttributeError: 'Bag' object has no attribute 'items' 

我要初始化袋()沒有把路過的一個參數爲項目

希望一切都清楚,告訴我如果不是。

任何想法或任何代碼錯誤?

+3

我認爲你可以做'def __init __(self,items = None) :'當你想要設置時,它仍然允許'items'被設置 – davedwards

+0

@downshift我做了你所建議的改變,但它仍然給我同樣的例外。 –

+0

我的道歉,把'self.items = items'作爲def __init __後面的第一行__(..' – davedwards

回答

2
from collections import defaultdict 

class Bag(object): 

def __init__(self, items=None): 
    self.items = items or list() 
    if not self.items: 
     self.items = defaultdict() 
    else: 
     temp_dict = defaultdict() 
     for key in self.items: 
      temp_dict[key] += 1 
     self.items = temp_dict 

我做了一些修改:

1)創建self.itemsitems 2)初始化無使用is None,或者乾脆not self.items比較,因爲空列表評估爲False

+3

請注意可變的默認值http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+1

請不要使用一個可變值作爲參數的默認值,它在創建函數的時間和在調用中共享_,所以如果你的函數更新'items',下一個調用將會看到它,使用'None'作爲默認值,然後在訪問它時使用'items或[]'(或'iems或defaultdict(int)') – 9000

+0

謝謝...我更新了我的代碼 – labheshr

1

'Bag' object has no attribute 'items'手段:您正在訪問的Bag的方法中的某處尚未定義的self.items

而且的確如此。在構造函數中,您編寫了以下代碼:if self.items == None:之前,您將第一個任務分配到self.items,從而創建它。

我認爲這是一個錯字,你的意思是if items is None:,指的是參數。

雖然這段代碼可以簡化。我的看法:

import collections # Batteries included. 

... 
def __init__(self, items=None): 
    if not items: # Covers both None and empty list. 
     self.items = {} 
    else: 
     self.items = collections.Counter(items) 

這可以簡化甚至更多:

 ... 
    self.items = collections.Counter(items or []) 

如果嚴格想使用defaultdict,您可以:

 self.items = collections.defauldict(int, collections.Counter(items or [])) 

(請注意,defaultdict()沒有論點有點意義。)

+0

感謝您的建議。我很樂意使用Counter,但是,不幸的是,我正在處理的項目需要使用「defaultdict」。 –

+0

拿出額外的建議,這解決了你的問題,沒有「改變」你的初始代碼 – 2017-04-22 02:50:15

+0

更新了我的答案。 – 9000

相關問題