Как создать функцию __init__?

#python

#python

Вопрос:

Это инструкции:

1. Определите класс с именем Bag в модуле с именем bag.py

2.Определите метод инициализации, который имеет один параметр, повторяющийся из значений, инициализирующих пакет. При написании Bag() создается пустой пакет. Writing Bag([‘d’, ‘a’, ‘b’, ‘d’, ‘c’, ‘b’,’d’]) создайте пакет с одним ‘a’, двумя ‘b’, одним ‘c’ и тремя ‘d’. Объекты в классе Bag должны хранить только словарь, указанный выше: он не должен хранить / манипулировать никакими другими переменными self

 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 требуемый позиционный аргумент. Кто-нибудь может сказать мне, как это исправить?

Ответ №1:

Ваш метод инициализации ожидает, что аргумент i будет инициализирован, и еще одна проблема вашего кода заключается в self .bag никогда не будет инициализироваться списком, если len(i) не равен нулю, вы можете добавить к bag, если он не определен как список заранее. Приведенный ниже код должен соответствовать тому, что вы хотите

 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
  

Ответ №2:

Первое возникшее исключение:

Ваш c-->b = Bag() вызов ожидает, что аргумент будет передан в Bag. Например Bag(['f', 'o', 'o'])

Второе вызванное исключение:

Если вы действительно передадите аргумент через конструктор Bag, длина будет больше 0, и bag никогда не будет создан, поэтому вы не сможете к нему добавить. Я не уверен, что вы пытаетесь сделать, но, возможно, self.bag = [] независимо от длины i?

Комментарии:

1. Я просто не уверен, как заставить это работать. Поскольку c—>b = Bag() всегда будет вызывать ошибку, если в функции инициализации есть параметр ‘i’. Но в инструкции меня просили создать функцию инициализации с этим параметром ‘i’.

2. Извините, я все еще не до конца понимаю, о чем вы спрашиваете. Можете ли вы попробовать изменить def __init__(self, i): на def __init__(self, i = [ ]):

Ответ №3:

Похоже, все может быть проще, если вы используете встроенный 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