如何测试类及其方法

时间:2019-08-21 23:02:00

标签: python

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

编辑1

我尝试了这个,但是我知道它错了。

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'())

3 个答案:

答案 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())