抽象类 ABC模块的简单应用

# -*- coding: utf-8 -*-

from abc import ABC ,abstractmethod
from collections import namedtuple
#  为什么要用抽象类呢   抽象类解决有些基类不能实现方法,如水果不可以有吃的方法,但是子类如苹果可以有吃的方法,
#  抽象类的方法什么都不用做,但是子类必须实现抽象类里面的所有方法才可以合法实例化

#理解有限,大家多多指教  
Customer = namedtuple('Customer','name,fidelity')#Customer 可以看成是类名,后面的是类的两个属性.

class LineItem:
    '''获取总购物价值'''
    def __init__(self,product,quantity,price):
        self.product =product
        self.quantity =quantity
        self.price = price

    def total(self):
        return self.price *self.quantity



class order:
        def __init__(self,customer,cart ,promotion=None):
            self.customer =customer
            self .cart =list(cart)
            self .promotion =promotion

        def total(self):
            if not hasattr(self,'__total'):#判断类的属性中是否包含__total
                self.__total =sum(item.total() for item in self.cart)
            return self.__total

        def due(self):
            if self.promotion is None:
                discount =0
            else:
                discount =self.promotion.discount(self)
            return self.total()-discount

        def __repr__(self):

            fmt = '<Order total :{:.2f} due :{:.2f}>'
            return fmt.format(self.total(),self.due())

class Promotion(ABC):

        @abstractmethod
        def discount(self,order):
            '''返回折扣的正值'''

class FidelityPromo(Promotion):

        def discount(self,order):

            return order.total()*0.05 if order.customer.fidelity>=1000 else 0


class BulkItemPromo(Promotion):

        def discount(self,order):
            discount=0
            for item in order.cart:
                if item.quantity>=20:
                    discount+=item.total()*0.1
            return discount


class LargeOrderPromo(Promotion):
        def discount(self,order):
            distinct_items = {item.product for item in order.cart}
            if len(distinct_items)>=10:
                return order.total()*0.07
            return 0


joe=Customer('john Deo',0)
ann=Customer('ANN',1100)

cart =[LineItem('banana',4,.5),
       LineItem('apple',10,1.5),
       LineItem('water',5,5.0)]
print(cart)

print(order(joe,cart,FidelityPromo()))
print(order(ann,cart,FidelityPromo()))




[<__main__.LineItem object at 0x7f5471d90048>, <__main__.LineItem object at 0x7f5471d90080>, <__main__.LineItem object at 0x7f5471d900b8>]
<Order total :42.00 due :42.00>
<Order total :42.00 due :39.90>



猜你喜欢

转载自blog.csdn.net/qq_41000421/article/details/84707279
今日推荐