# -*- 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>
抽象类 ABC模块的简单应用
最新推荐文章于 2024-08-12 10:32:00 发布