python中的abstractmethod


 


#
-*- coding: utf-8 -*- from abc import ABC ,abstractclassmethod from collections import namedtuple Customer = namedtuple('Customer','name fidelity') class lineItem: """初始化明細行:產品、數量、單價""" def __init__(self,product,qty,price): self.product = product self.qty = qty self.price = price def total(self): return self.price*self.qty class Order: """客戶、購物車、 促銷活動""" def __init__(self, customer, cart, promotion=None): self.customer = customer self.cart = list(cart) self.promotion = promotion def total(self): """hasattr:用法:判斷是否包含對應的屬性""" if not hasattr(self,'__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:抽象方法,含abstractmethod方法的類不能實例化,繼承了含abstractmethod方法的子類必須復寫所有abstractmethod裝飾的方法,未被裝飾的可以不重寫 @ property:方法偽裝屬性,方法返回值及屬性值,被裝飾方法不能有參數,必須實例化后調用,類不能調用 @ classmethod:類方法,可以通過實例對象和類對象調用,被該函數修飾的方法第一個參數代表類本身常用cls,被修飾函數內可調用類屬性,不能調用實例屬性 @staticmethod:靜態方法,可以通過實例對象和類對象調用,被裝飾函數可無參數,被裝飾函數內部通過類名.屬性引用類屬性或類方法,不能引用實例屬性 """ @abstractclassmethod def discount(self,order): """返回折扣金額、""" class FidelityPromo(Promotion): #策略1 """積分為1000或以上的客戶提供5%的折扣""" def discount(self,order): return order.total()*0.05 if order.customer.fidelity>=1000 else 0 class BulkItemPromo(Promotion):#策略2 """單個商品為20個或以上時提供10%的折扣""" 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):#策略3 """訂單中不同商品達到10個或以上時提供7%的折扣""" def discount(self, order): discount_items = {item.product for item in order.cart} if len(discount_items)>=10: return order.total()*0.07 return 0














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM