【问题标题】:OOP in python programmingpython编程中的OOP
【发布时间】:2017-05-22 14:10:45
【问题描述】:

大家好,我是 python 语言编程的新手,希望能得到您的帮助。问题是这样的:

  1. 创建一个名为 ShoppingCart 的类。

  2. 创建一个不带参数并设置总数的构造函数 属性为零,并初始化一个名为 项目。

  3. 创建需要 item_name、数量和价格的方法 add_item 论据。此方法应将添加项目的成本添加到 总计的当前值。它还应该向项目添加一个条目 dict 使得键是 item_name 而值是 商品数量。

  4. 创建一个需要类似参数的方法 remove_item 添加项目。它应该删除已添加到 购物车,不是必需的。该方法应扣除 从当前总数中删除项目的成本,并更新 项目 dict 相应地。

  5. 如果要删除的项目数量超过当前 购物车中该商品的数量,假设该商品的所有条目 项目将被删除。

  6. 创建一个方法 checkout 接受 cash_paid 并返回 付款余额的价值。如果 cash_paid 还不够 补全,返回“现金支付不足”。

  7. 创建一个名为 Shop 的类,该类有一个构造函数,该构造函数不接受 参数并在 100 处初始化一个称为数量的属性。 确保 Shop 继承自 ShoppingCart。

  8. 在 Shop 类中,重写 remove_item 方法,这样 不带参数调用 Shop 的 remove_item 会减少数量 一个

这是我的代码

class ShoppingCart(object):

    def __init__(self):
        self.total = 0
        self.items = dict()

    def add_item(self, item_name, quantity, price):
        if item_name != None and quantity >= 1:
            self.items.update({item_name: quantity})
        if quantity and price >= 1:
            self.total += (quantity * price)

    def remove_item(self, item_name, quantity, price):
        self.total -= (quantity * price)
        try:
            if quantity >= self.items[item_name]:
                self.items.pop(item_name, None)
            self.items[item_name] -= quantity
        except(KeyError, RuntimeError):
            pass

    def checkout(self, cash_paid):
        balance = 0
        if cash_paid < self.total:
            return "Cash paid not enough"
        balance = cash_paid - self.total
        return balance


class Shop(ShoppingCart):

    def __init__(self):
        self.quantity = 100

    def remove_item(self):
        self.quantity -= 1

还有单元测试

import unittest;

class Test(unittest.TestCase):
    def setUp(self):
        self.cart = ShoppingCart()
        self.shop = Shop()

    def test_cart_property_initialization(self):
        self.assertEqual(self.cart.total, 0, msg='Initial value of total not correct')
        self.assertIsInstance(self.cart.items, dict, msg='Items is not a dictionary')

    def test_add_item(self):
        self.cart.add_item('Mango', 3, 10)
        self.assertEqual(self.cart.total, 30, msg='Cart total not correct after adding items')
        self.assertEqual(self.cart.items['Mango'], 3, msg='Quantity of items not correct after adding item')

    def test_add_item_hidden(self):
        self.cart.add_item('Mango', 3, 10)
        self.cart.add_item('Orange', 16, 10)
        self.assertEqual(self.cart.total, 190, msg='Cart total not correct after adding items')
        self.assertEqual(self.cart.items['Orange'], 16, msg='Quantity of items not correct after adding item')

    def test_remove_item(self):
        self.cart.add_item('Mango', 3, 10)
        self.cart.remove_item('Mango', 2, 10)
        self.assertEqual(self.cart.total, 10, msg='Cart total not correct after removing item')
        self.assertEqual(self.cart.items['Mango'], 1, msg='Quantity of items not correct after removing item')

    def test_remove_item_hidden(self):
        self.cart.add_item('Mango', 3, 10)
        self.cart.add_item('Orange', 16, 10)
        self.cart.remove_item('Mango', 2, 10)
        self.assertEqual(self.cart.total, 170, msg='Cart total not correct after removing item')
        self.assertEqual(self.cart.items['Mango'], 1, msg='Quantity of items not correct after removing item')
        self.cart.remove_item('Mango', 2, 10)
        self.assertEqual(self.cart.total, 160, msg='Cart total not correct after removing item')
        with self.assertRaises(KeyError):
            self.cart.items['Mango']

    def test_checkout_returns_correct_value(self):
        self.cart.add_item('Mango', 3, 10)
        self.cart.add_item('Orange', 16, 10)
        self.assertEqual(self.cart.checkout(265), 75, msg='Balance of checkout not correct')
        self.assertEqual(self.cart.checkout(25), 'Cash paid not enough', msg='Balance of checkout not correct')


    def test_shop_is_instance_of_shopping_cart(self):
        self.assertTrue(isinstance(self.shop, ShoppingCart), msg='Shop is not a subclass of ShoppingCart')

    def test_shop_initializaton(self):
        self.assertEqual(self.shop.quantity, 100, msg='Shop quantity not initialized correctly')

    def test_shop_remove_item_method(self):
        for i in range(15):
            self.shop.remove_item()

        self.assertEqual(self.shop.quantity, 85)

现在运行 unitest 后,我​​收到以下错误消息:

“150 != 160 : 删除商品后购物车总数不正确”

任何愿意提供帮助的人都将不胜感激。

【问题讨论】:

  • 哪个单元测试?请尝试创建一个minimal reproducible example
  • test_remove_item_hidden 中,您断言购物车总数应为 170,然后删除两个值为 10 的芒果,然后断言总数应为 160。
  • 这似乎是家庭作业......
  • 写这个“练习”的人应该停止假装教 OOP - 他们显然没有掌握整个概念......“Shop”继承自“Cart”并用不兼容的 sig 覆盖 remove_item 和完全不相关的行为#facepalm
  • 你为什么要赶上RuntimeError

标签: python


【解决方案1】:

看起来在remove_item 类属性中,您在确定是否要删除的商品数量超过您之前更新购物车的总价值。

如果您对其进行修改,以便首先检查项目数量,然后如果少于要删除的总数,则减去可用的总数......它应该可以解决问题

def remove_item(self, item_name, quantity, price):
    try:
        if quantity >= self.items[item_name]:

            self.total -= (self.items[item_name] * price)
            self.items.pop(item_name, None)
        else:
            self.items[item_name] -= quantity
            self.total -= (quantity * price)

【讨论】:

  • 是的,感谢您的编辑...我们仍然希望减少数量,如果在移除有问题的商品时,它仍然在购物车中留下一些。
【解决方案2】:

你的测试是错误的。在这里,您的代码检查购物车总数是否为 170 现金:

self.assertEqual(self.cart.total, 170, msg='Cart total not correct after removing item')

然后它以每个 10 现金的价格移除 2 件物品:

self.cart.remove_item('Mango', 2, 10)

然后查看是否还有160现金:

self.assertEqual(self.cart.total, 160, msg='Cart total not correct after removing item')

但它没有,它有 150 现金,这是任何人所期望的 (170 - 20 = 150)。

【讨论】:

  • 他吃了 3 个芒果,去掉了 2 个,又去掉了 2 个,所以 160 是正确的
  • @MaartenFabré,在他移除前 2 个芒果后,总数为 170。
  • 是的,但是只剩下 1 个芒果了,所以即使被要求移除 2 个芒果,也应该只减去 1 个
【解决方案3】:

问题在于您的 add_item 方法您没有更新项目,因此每次添加相同的项目时它不会更新它只是再次退出 item_namequantity 并忘记以前的值所以这就是你的add_item 方法应该是这样的:

def add_item(self, item_name, quantity, price):
    self.total += price*quantity
    self.items.update({item_name: quantity})

【讨论】:

    【解决方案4】:

    这应该可以正常工作

    class ShoppingCart(object):
    
        def __init__(self):
            self.total = 0
            self.items = dict()
    
        def add_item(self, item_name, quantity, price):
            if item_name != None and quantity >= 1:
                self.items.update({item_name: quantity})
            if quantity and price >= 1:
                self.total += (quantity * price)
    
        def remove_item(self, item_name, quantity, price):
            try:
                if quantity >= self.items[item_name]:
    
                    self.total -= (self.items[item_name] * price)
                    self.items.pop(item_name, None)
    
                else:
                  self.items[item_name] -= quantity
                  self.total -= (quantity * price)
            except IOError:
                print
                "Error: can\'t find file or read data"
    
        def checkout(self, cash_paid):
            balance = 0
            if cash_paid < self.total:
                return "Cash paid not enough"
            balance = cash_paid - self.total
            return balance
    
    
    class Shop(ShoppingCart):   
        def __init__(self):
            self.quantity = 100
    
        def remove_item(self):
            self.quantity -= 1
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2021-05-28
      • 2012-02-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2013-12-16
      • 2010-09-27
      • 2011-03-11
      相关资源
      最近更新 更多