我之前已经在不同的版本中看到过这个问题,但我觉得好像已经实现了我在这些主题中看到的反馈(主要是确保对象是按照我昨晚做的那样创建的,并且确保字典启动,我觉得我已经在第三行完成了)我仍然收到错误。任何建议将非常感谢。谢谢!
class Groceries:
def __init__(self, grocery_list):
self.grocery_list = {}
def add_item(self, item):
item = input("name: ")
purchased = input(False)
self.grocery_list[item] = purchased
something = Groceries()
something.add_item()
我得到的错误是:
Traceback (most recent call last):
File "intermediate_python.py", line 14, in <module>
something = Groceries()
TypeError: __init__() missing 1 required positional argument: 'grocery_list'
我尝试通过从def init 语句中删除grocery_list来解决此错误(不知道为什么这会起作用,我只是玩游戏)并且错误被移动到下一行:< / p>
Traceback (most recent call last):
File "intermediate_python.py", line 15, in <module>
something.add_item()
TypeError: add_item() missing 1 required positional argument: 'item'
答案 0 :(得分:1)
要初始化Groceries类的实例,您需要提供在init方法中定义的参数“grocery_list”
class Groceries:
def __init__(self, grocery_list):
self.grocery_list = {}
尝试使用以下内容创建您的实例:
something = Groceries({"milk": 1, "butter": 1})
或者,要允许空Groceries对象,可以向init方法添加默认参数,还应该将参数的值赋给变量self.grocery_list,而不是将其分配为空字典:
class Groceries:
def __init__(self, grocery_list={}):
self.grocery_list = grocery_list
以及你的方法add_item,你需要传递一个参数或者删除参数(因为你要求它作为输入)
def add_item(self):
item = input("name: ")
purchased = input("amount: ")
self.grocery_list[item] = purchased
something = Groceries({"milk": 0})
something.add_item()
>> name:
>>> milk
>> amount:
>>> 1
答案 1 :(得分:0)
将__init__
更改为此:
def __init__(self, grocery_list = {}):
self.grocery_list = grocery_list
这样,如果您提供杂货字典,则将其设置为值,否则为空字典。
答案 2 :(得分:0)
def __init__(self, grocery_list):
self.grocery_list = {}
虽然您正在将grocery_list传递给构造函数,但实际上并没有使用它来设置值。你只需要设置self.grocery_list等于传递的参数grocery_list来解决这个问题,如下所示。
def add_item(self, item):
item = input("name: ")
您还尝试将item作为参数传递,并在函数中手动输入。这意味着无论您向add_item发送什么输入,您都将始终使用用户输入覆盖该值。您可以通过使item参数可选并在提示用户输入之前检查它是否已通过来解决此问题。
purchased = input(False)
self.grocery_list[item] = purchased
此外,还不清楚为什么在请求项目名称后,为了提取输入,将布尔值False隐式转换为字符串作为第二个提示。您似乎想要将某些购买价值设置为True或False,但也不清楚为什么您首先使用字典制作杂货清单,除非您打算将数量包含在字典值中。如果您只是想查看商品是否在购物清单上,您可以使用set()类型而不是dict()。如果您想维持数量,这可以作为一个例子来帮助您前进。
class Groceries:
def __init__(self, grocery_list={}):
self.grocery_list = grocery_list
def add_item(self, item='', qty=1):
if not item: item = input('name: ')
if item in self.grocery_list:
self.grocery_list[item] += qty
else:
self.grocery_list[item] = qty
def item_qty(self, item=''):
if not item: item = input('name: ')
return(self.grocery_list[item])
def print_all(self):
for key, val in self.grocery_list.items():
print(val, key)
something = Groceries()
something.add_item('apple') # add one apple to groceries
print(something.item_qty('apple'))
something.add_item('apple', 3) # add three apples to groceries
print(something.item_qty('apple'))
something.add_item() # add arbitrary item to groceries
something.print_all() # print all groceries
答案 3 :(得分:0)
如果要创建Groceries类的实例(something = Groceries(*args)
),则在初始化结束时,将使用相同的参数列表Groceries.__init__()
调用*args
函数。
这意味着,当您编写something = Groceries()
时,您试图在没有参数的情况下调用__init__
函数。另一方面,该函数具有必需的位置参数grocery_list
(如果您没有为其提供默认值,则需要任何位置参数。)
由于您的代码无论如何都将grocery_list
定义为空字典,因此您不需要将此参数设置为__init__
函数,您只需使用:
def __init__(self):
self.grocery_list = {}
这将解决错误。
或者您可以使用默认值并使用:
def __init__(self, grocery_list={}):
self.grocery_list = grocery_list
在不提供__init__
参数的情况下,您可以使用grocery_list
,在这种情况下使用{}。
完全相同的情况适用于add_item
函数:您使用必需的位置参数定义它,然后您尝试在没有任何参数的情况下调用它。由于您没有将任何值传递给稍后使用的函数调用中的函数,因此您可以再次删除该参数并使用:
def add_item(self):