2016-10-22 111 views
0

這是操作的指令:如何創建__init__函數?

1.定義一個模塊中名爲袋類名爲bag.py

2.Define一個INIT方法具有一個參數,即initalize袋值的迭代。書寫袋()構成一個空袋子。書包(['d','a','b','d','c','b','d'])構成一個'a',兩個'b','c' ,還有三個'd'。在袋類對象應該只存儲字典上述規定的:它不應該存儲/處理任何其他自變量

from collections import defaultdict 
from goody import type_as_str 
from test.test_string import Bag 

class Bag: 
    def __init__(self, i): 
     if len(i) == 0: 
      self.bag = [] 
     for x in i: 
      self.bag.append(x) 




if __name__ == '__main__': 
    #driver tests 
    import driver 
    driver.default_file_name = 'bsc1.txt' 
#  driver.default_show_exception= True 
#  driver.default_show_exception_message= True 
#  driver.default_show_traceback= True 
    driver.driver() 

這是我得到的錯誤:

7 # Test init, repr, and str 
    8 *Error: b = Bag() raised exception TypeError: __init__() missing 1 required positional argument: 'i' 
    9 *Error: repr(b) in ['Bag()','Bag([])'] raised exception NameError: name 'b' is not defined 
10 *Error: str(b) raised exception NameError: name 'b' is not defined 
11 *Error: b = Bag(['d','a','b','d','c','b','d']) raised exception AttributeError: 'Bag' object has no attribute 'bag' 
12 *Error: all((repr(b).count('\''+v+'\'')==c for v,c in dict(a=1,b=2,c=1,d=3).items())) raised exception NameError: name 'b' is not defined 
13 *Error: all((v+'['+str(c)+']' in str(b) for v,c in dict(a=1,b=2,c=1,d=3).items())) raised exception NameError: name 'b' is not defined 

輸入是:

# Test init, repr, and str 
c-->b = Bag() 
e-->repr(b) in ['Bag()','Bag([])']-->True 
e-->str(b)-->Bag() 
c-->b = Bag(['d','a','b','d','c','b','d']) 
e-->all((repr(b).count('\''+v+'\'')==c for v,c in dict(a=1,b=2,c=1,d=3).items()))-->True 
e-->all((v+'['+str(c)+']' in str(b) for v,c in dict(a=1,b=2,c=1,d=3).items()))-->True 

我不知道如何使初始化功能。因爲第一個輸入調用b = Bag(),所以總是會引發錯誤:b = Bag()引發異常TypeError:init()缺少1個需要的位置參數。任何人都可以告訴我如何解決它?

回答

0

你的init方法期望我的參數被初始化, 而你的代碼的另一個問題是self.bag將永遠不會初始化爲一個列表,如果len(i)不爲零,你可以將它追加到bag if它並未事先將其定義爲清單。下面 代碼應該適合你想要什麼

class Bag: 
    def __init__(self, i=None): 
     self.bag = [] 
     if i == None: 
      pass # i is None, do nothing after create empty bag 
     elif type(i)==list: 
      self.bag.extend(i) # append whole list i into bag with extend method 
     else: 
      self.bag.append(i) # append single item i into bag 

# example 
Emptybag = Bag() 
Bag1 = Bag('item1') # Initialize with 1 item 
Bag2 = Bag(['item1', 'item2']) # initialize with list of items 
+0

謝謝,它工作正常。 – jiahuiding

0

第一個出現的異常:

c-->b = Bag()調用需要傳遞給包的參數。例如Bag(['f', 'o', 'o'])

第二個出現的異常:

如果你確實穿過袋構造函數的參數長度將大於0和包永遠不會創建所以你不能追加到它。我不知道你想要做什麼,但不管我的長度如何,也許self.bag = []

+0

我只是不知道如何使它工作。由於c_> b = Bag()將在__init__函數中存在參數'i'時始終導致錯誤。但是指令要求我用該參數'i'創建__init__函數。 – jiahuiding

+0

我很抱歉,我仍然不完全明白你在問什麼。你可以嘗試將'def __init __(self,i):'改成'def __init __(self,i = []):' – atomSmasher

0

聽起來像是如果你使用的東西,可能是簡單的內置Counter類,這是collections模塊中。從文檔:

>>> c = Counter()       # a new, empty counter 
>>> c = Counter('gallahad')     # a new counter from an iterable 
>>> c = Counter({'red': 4, 'blue': 2})  # a new counter from a mapping 
>>> c = Counter(cats=4, dogs=8)    # a new counter from keyword args