Python的新手,出现了一个我不确定如何解决的错误。试图回答家庭作业问题。我对如何测试类及其方法有些困惑,这是问题的第二部分。有特殊的做法吗?
按照以下规范编写一个类来表示产品:
类名:产品(注意大写的“ P”)
定义由字典中的项目指定的实例属性 对象product2,即已停产,lead_time_days等。
定义用于初始化实例属性的 init ()方法 传递给方法的参数值
定义一个set_product_name()方法,该方法在 实例变量为所传递参数的值
定义一个get_product_details()方法,该方法返回产品 详细信息格式为“ product_name-product_description”
定义了类之后,您需要测试该类及其 证明它有效的方法。您可以按照以下步骤进行操作:
实例化该类的对象(将其命名为prod)并将product2传递给 初始化程序(传递整个product2对象,而不是单个对象) 属性)
通过调用将product_name设置为其他名称 set_product_name()并传递一个适当的参数
调用get_product_details()获取产品名称和描述 (并打印)
代码:
product2 = {
"discontinued": 0,
"lead_time_days": 4,
"product_category": "Personal Computers",
"product_description": "8 inch Display (1920x1200) ...",
"product_id": 104,
"product_name": "NVIDIA SHIELD Tablet (WiFi)",
"reorder_level": 10,
"unit_price": 299.0
}
# My Code
class Product:
def __init__(self, discontinued, lead_time_days, product_category, product_description, product_id, product_name, reorder_level, unit_price):
self.discontinued = discontinued
self.product_category = product_category
self.product_description = product_description
self.product_id = product_id
self.product_name = product_name
self.reorder_level = reorder_level
self.unit_price = unit_price
def set_product_name(self, value):
self.product_name = value
def get_product_details(self):
return self.product_name + " " + self.product_description
我尝试了这个,但是我知道它错了。
prod = Product(product2["discontinued"], product2["product_category"], product2['product_description'], product2['product_id'], product2['product_name'],product2['reorder_level'],product2['unit_price'])
prod.set_product_name('star')
print ('get_product_details'())
答案 0 :(得分:3)
提示:使用解压缩将关键字参数传递给类方法。
这可以通过将您的班级更改为以下内容来完成:
class Product:
def __init__(self, discontinued=None, lead_time_days=None, product_category=None, product_description=None, product_id=None, product_name=None, reorder_level=None, unit_price=None):
self.discontinued = discontinued
self.product_category = product_category
self.product_description = product_description
self.product_id = product_id
self.product_name = product_name
self.reorder_level = reorder_level
self.unit_price = unit_price
def set_product_name(self, value):
self.product_name = value
def get_product_details(self):
return self.product_name + " " + self.product_description
通过为您的参数提供默认值(例如,不连续=无),可以使它们成为关键字参数。如果您有字典或函数的大量输入,这将很有帮助。
要创建对象/实例化类,可以调用:
obj = Product(**product2)
** product2的基本含义是:
discontinued=0,lead_time_days=4,product_category="Personal Computers",product_description="8 inch Display (1920x1200) ...",product_id=104,product_name="NVIDIA SHIELD Tablet (WiFi)",reorder_level=10,unit_price=299.0
实例化对象后,可以使用点表示法调用其方法:
obj.set_product_name('new name')
print(obj.get_product_details())
答案 1 :(得分:1)
product2
可以作为kwargs格来传递。
然后,您可以为创建的实例调用函数:
prod = Product(**product2)
prod.set_product_name('star')
print (prod.get_product_details())
star 8 inch Display (1920x1200) ...
答案 2 :(得分:0)
1。。您的测试代码不符合“传递整个product2对象,而不是单个属性”的要求。您传递各个属性:
prod = Product(product2["discontinued"], product2["product_category"], product2['product_description'], product2['product_id'], product2['product_name'],product2['reorder_level'],product2['unit_price'])
2。。setattr(object, name, value)功能将很方便。
我的解决方案:
product2 = {
"discontinued": 0,
"lead_time_days": 4,
"product_category": "Personal Computers",
"product_description": "8 inch Display (1920x1200) ...",
"product_id": 104,
"product_name": "NVIDIA SHIELD Tablet (WiFi)",
"reorder_level": 10,
"unit_price": 299.0
}
class Product:
def __init__(self, specification):
for key, value in specification.items():
setattr(self, key, value)
def set_product_name(self, value):
self.product_name = value
def get_product_details(self):
return f'{self.product_name} - {self.product_description}'
###Test
# Instantiate an object of the class (name it prod) and pass product2 to
# the initialiser (pass the whole product2 object, not individual attributes)
prod = Product(product2)
# Set the product_name to something different by calling set_product_name()
# and passing it an appropriate parameter
prod.set_product_name('Another Tablet')
# Call get_product_details() to get the product name and
# description (and print it)
print(prod.get_product_details())