python abstractmethod_python中的abstractmethod

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

from abc importABC ,abstractclassmethodfrom collections importnamedtuple

Customer= namedtuple('Customer','name fidelity')classlineItem:"""初始化明细行:产品、数量、单价"""

def __init__(self,product,qty,price):

self.product=product

self.qty=qty

self.price=pricedeftotal(self):return self.price*self.qtyclassOrder:"""客户、购物车、 促销活动"""

def __init__(self, customer, cart, promotion=None):

self.customer=customer

self.cart=list(cart)

self.promotion=promotiondeftotal(self):"""hasattr:用法:判断是否包含对应的属性"""

if not hasattr(self,'__total'):

self.__total = sum(item.total() for item in self.cart) #计算购物车里总金额

return self.__total

defdue(self):if self.promotion isNone:

discount=0else:

discount=self.promotion.discount(self)return self.total()-discountdef __repr__(self):

fmt= ''

returnfmt.format(self.total(),self.due())class Promotion(ABC): #策略 抽象基类

"""@abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写

@ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用

@ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性

@staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性"""@abstractclassmethoddefdiscount(self,order):"""返回折扣金额、"""

class FidelityPromo(Promotion): #策略1

"""积分为1000或以上的客户提供5%的折扣"""

defdiscount(self,order):return order.total()*0.05 if order.customer.fidelity>=1000 else0class BulkItemPromo(Promotion):#策略2

"""单个商品为20个或以上时提供10%的折扣"""

defdiscount(self,order):

discount=0for item inorder.cart:if item.quantity>=20:

discount+=item.total()*0.1

returndiscountclass LargeOrderPromo(Promotion):#策略3

"""订单中不同商品达到10个或以上时提供7%的折扣"""

defdiscount(self, order):

discount_items= {item.product for item inorder.cart}if len(discount_items)>=10:return order.total()*0.07

return 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值