## Python函数式编程进阶：用函数实现设计模式

news/2024/8/6 11:38:35/文章来源:https://blog.csdn.net/douhuanmin123/article/details/139300675

#### 文章目录

• 函数式编程进阶：用函数实现设计模式
• 案例实现：构建“策略”模式
• 使用函数实现”策略“模式
• 享元
• 选择最佳策略：简单的方式
• globals关键字

## 函数式编程进阶：用函数实现设计模式

### 案例实现：构建“策略”模式

``````from abc import ABC, abstractmethod
from collections import namedtupleCustomer = namedtuple("Customer",'name fidelity')class LineItem:def __init__(self,product,quantity,price) -> None:self.product = productself.quantity = quantityself.price = pricedef total(self):return self.quantity * self.priceclass Order: # 上下文def __init__(self, customer, cart, promotion=None) -> None:self.customer = customerself.cart = list(cart)self.promotion = promotiondef total(self):if not hasattr(self,'__total'):self.__total = sum(item.total() for item in self.cart)return self.__totaldef due(self):if self.promotion is None:discount = 0else:discount = self.promotion.discount(self)return self.total() - discountdef __repr__(self) -> str:fmt = '<Order total: {:.2f} due: {:.2f}'return fmt.format(self.total,self.due)class Promotion(ABC): #抽象基类@abstractmethoddef discount(self, order):"""返回折扣金额"""class FidelityPromo(Promotion):def discount(self, order):"""积分为1000以上的顾客提供5%的折扣"""return order.total() * .05 if order.customer.fidelity >= 1000 else 0class BulkItemPromo(Promotion):def discount(self,order):"""单个商品为20个或以上时提供10%折扣"""discount = 0 for item in order.cart:if item.quantity >= 20:discount += item.total() * .10return discountclass LargeOrderPromo(Promotion):"""订单中的不同商品达到10个以上时提供7%折扣"""def discount(self,order):discount = 0for item in order.cart:if item.quantity >= 10:discount += item.total() * .07return discount``````

``````joe = Customer('John Doe', 0)
ann = Customer('Ann Smith',1000)
cart = [LineItem('banana',4,.5),LineItem('apple',10,1.5),LineItem('watermelon',5,5.0)]order_joe = Order(joe,cart,FidelityPromo())
order_ann = Order(ann,cart,FidelityPromo())
print(repr(order_ann))
print(repr(order_joe))
# 输出
# <Order total: 42.00 due: 39.90>
# <Order total: 42.00 due: 42.00>
``````

#### 使用函数实现”策略“模式

``````from abc import ABC, abstractmethod
from collections import namedtupleCustomer = namedtuple("Customer",'name fidelity')class LineItem:def __init__(self,product,quantity,price) -> None:self.product = productself.quantity = quantityself.price = pricedef total(self):return self.quantity * self.priceclass Order: # 上下文def __init__(self, customer, cart, promotion=None) -> None:self.customer = customerself.cart = list(cart)self.promotion = promotiondef total(self):if not hasattr(self,'__total'):self.__total = sum(item.total() for item in self.cart)return self.__totaldef due(self):if self.promotion is None:discount = 0else:discount = self.promotion(self)return self.total() - discountdef __repr__(self) -> str:fmt = '<Order total: {:.2f} due: {:.2f}>'return fmt.format(self.total(),self.due())def fidelity_promo(order):"""积分大于1000给予5%的折扣"""return order.total() * .05 if order.customer.fidelity >= 1000 else 0def bulk_item_promo(order):"""单个商品20个以上提供10%的折扣"""discount = 0 for item in order.cart:if item.quantity >= 20:discount += item.total() * .1return discountdef large_order_promo(order):"""订单中不同商品的个数达到10个以上时提供7%的折扣"""distinct_item = {item.product for item in order.cart}if len(distinct_item >= 10):return order.total() * .07return 0joe = Customer('John Doe', 0)
ann = Customer('Ann Smith',1000)
cart = [LineItem('banana',4,.5),LineItem('apple',10,1.5),LineItem('watermelon',5,5.0)]order_joe = Order(joe,cart,fidelity_promo)
order_ann = Order(ann,cart,fidelity_promo)
print(repr(order_ann))
print(repr(order_joe))``````

#### 选择最佳策略：简单的方式

``````promos = [fidelity_promo,bulk_item_promo,large_order_promo]
def best_promo(order):return max(promo(order) for promo in promos)
``````

### globals关键字

globals()是python的一个内置方法，表示当前的全局符号表.

``````{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000234CBDD6CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'c:\\Users\\Administrator\\GithubRepo\\study_recording\\fluent_python\\ch06_07\\functional_pattern_design.py', '__cached__': None, 'ABC': <class 'abc.ABC'>, 'abstractmethod': <function abstractmethod at 0x00000234CC2780D0>, 'namedtuple': <function namedtuple at 0x00000234CC466550>, 'Customer': <class '__main__.Customer'>, 'LineItem': <class '__main__.LineItem'>, 'Order': <class '__main__.Order'>, 'fidelity_promo':
<function fidelity_promo at 0x00000234CC486DC0>, 'bulk_item_promo': <function bulk_item_promo at 0x00000234CC4881F0>, 'large_order_promo': <function large_order_promo at 0x00000234CC488280>, 'promos': [<function fidelity_promo at 0x00000234CC486DC0>, <function bulk_item_promo at 0x00000234CC4881F0>, <function large_order_promo at 0x00000234CC488280>], 'best_promo': <function best_promo at 0x00000234CC488310>, 'joe': Customer(name='John Doe', fidelity=0), 'ann': Customer(name='Ann Smith', fidelity=1000), 'cart': [<__main__.LineItem object at 0x00000234CC281430>, <__main__.LineItem object at 0x00000234CC2D66A0>, <__main__.LineItem object at 0x00000234CC2D68E0>], 'banana_cart': [<__main__.LineItem object at 0x00000234CC2D62E0>, <__main__.LineItem object at 0x00000234CC2D63A0>], 'order_joe': <Order total: 42.00 due: 42.00>, 'order_ann': <Order total: 42.00 due: 39.90>, 'banana_order_joe': <Order total: 30.00 due: 28.50>, 'banana_order_ann': <Order total: 30.00 due: 28.50>}
``````

``````promos = [globals()[name] for name in globals()if name.endswith('_promo')and name != 'best_promo'] # 防止递归
def best_promo(order):return max(promo(order) for promo in promos)
``````

### 开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述

1. 文档管理系统是什么 文档管理系统&#xff08;DMS&#xff1a;Document Management System&#xff09;是一种软件系统&#xff0c;用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档&#xff0c;如文本文档、电子表格、图像、音频或视频文件等…

### 成都爱尔眼科医院《中、欧国际近视手术大数据白皮书2.0》解读会圆满举行

2024年5月12日&#xff0c;爱尔眼科联合中国健康促进基金会健康传播与促进专项基金、新华社新媒体中心与中南大学爱尔眼科研究院、爱尔数字眼科研究所重磅发布《中、欧国际近视手术大数据白皮书2.0》。这是继2021、2022年在国内相继发布《国人近视手术白皮书》、《2022中、欧近…

### idea configuration 配置 方便本地启动环境切换

idea 再项目启动的时候避免切换环境导致上线的时候出现环境配置问题 可以再idea 的 configuration 中配置项目的 vm options 虚拟机的内容占用 -Xmx256m -Xms256m -Xmn100m -Xss256k program arguments properties 文件中需要修改的配置参数 active profiles 指定启动的本…

### 如何降本增效获得目标客户？AI企业使用联盟营销这个方法就对了！

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 为什么AI企业难以获客呢&#xff1f; 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功…

### 【运筹学】前言：基础知识

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…