Python 库 functools 详解
functools模块是Python的标准库的一部分它是为高阶函数而实现的。高阶函数是作用于或返回另一个函数或多个函数的函数。一般来说对这个模块而言任何可调用的对象都可以作为一个函数来处理。functools 提供了 11 个函数1. cached_property将类的方法转换为一个属性该属性的值计算一次然后在实例的生命周期中将其缓存作为普通属性。与 property() 类似但添加了缓存对于在其他情况下实际不可变的高计算资源消耗的实例特征属性来说该函数非常有用。# cached_property 缓存属性 class cached_property(object): Decorator that converts a method with a single self argument into a property cached on the instance. Optional name argument allows you to make cached properties of other methods. (e.g. url cached_property(get_absolute_url, nameurl) ) def __init__(self, func, nameNone): # print(ff: {id(func)}) self.func func self.__doc__ getattr(func, __doc__) self.name name or func.__name__ def __get__(self, instance, typeNone): # print(fself func: {id(self.func)}) # print(finstance: {id(instance)}) if instance is None: return self res instance.__dict__[self.name] self.func(instance) return res class F00(): cached_property def test(self): # cached_property 将会把每个实例的属性存储到实例的__dict__中, 实例获取属性时, 将会优先从__dict__中获取则不会再次调用方法内部的过程 print(f运行test方法内部过程) return 3 property def t(self): print(运行t方法内部过程) return 44 f F00() print(f.test) # 第一次将会调用test方法内部过程 print(f.test) # 再次调用将直接从实例中的__dict__中直接获取不会再次调用方法内部过程 print(f.t) # 调用方法内部过程取值 print(f.t) # 调用方法内部过程取值 # 结果输出 # 运行test方法内部过程 # 3 # 3 # 运行t方法内部过程 # 44 # 运行t方法内部过程 # 442. cmp_to_key在 list.sort 和 内建函数 sorted 中都有一个 key 参数x [hello,worl,ni] x.sort(keylen) print(x) # [ni, worl, hello]3. lru_cache允许我们将一个函数的返回值快速地缓存或取消缓存。该装饰器用于缓存函数的调用结果对于需要多次调用的函数而且每次调用参数都相同则可以用该装饰器缓存调用结果从而加快程序运行。该装饰器会将不同的调用结果缓存在内存中因此需要注意内存占用问题。from functools import lru_cache lru_cache(maxsize30) # maxsize参数告诉lru_cache缓存最近多少个返回值 def fib(n): if n 2: return n return fib(n-1) fib(n-2) print([fib(n) for n in range(10)]) fib.cache_clear() # 清空缓存4. partial用于创建一个偏函数将默认参数包装一个可调用对象返回结果也是可调用对象。偏函数可以固定住原函数的部分参数从而在调用时更简单。from functools import partial int2 partial(int, base8) print(int2(123)) # 835. partialmethod对于 Python 偏函数partial理解运用起来比较简单就是对原函数某些参数设置默认值生成一个新函数。而如果对于类方法因为第一个参数是 self使用 partial 就会报错了。class functools.partialmethod(func, /, *args, **keywords)返回一个新的 partialmethod 描述器其行为类似 partial 但它被设计用作方法定义而非直接用作可调用对象。func 必须是一个 descriptor 或可调用对象同属两者的对象例如普通函数会被当作描述器来处理。当 func 是一个描述器例如普通 Python 函数classmethod(), staticmethod(), abstractmethod() 或其他 partialmethod 的实例时对__get__的调用会被委托给底层的描述器并会返回一个适当的部分对象作为结果。当 func 是一个非描述器类可调用对象时则会动态创建一个适当的绑定方法。当用作方法时其行为类似普通 Python 函数将会插入 self 参数作为第一个位置参数其位置甚至会处于提供给 partialmethod 构造器的 args 和 keywords 之前。from functools import partialmethod class Cell: def __init__(self): self._alive False property def alive(self): return self._alive def set_state(self, state): self._alive bool(state) set_alive partialmethod(set_state, True) set_dead partialmethod(set_state, False) print(type(partialmethod(set_state, False))) # class functools.partialmethod c Cell() c.alive # False c.set_alive() c.alive # True6. reduce函数的作用是将一个序列归纳为一个输出reduce(function, sequence, startValue)from functools import reduce l range(1,50) print(reduce(lambda x,y:xy, l)) # 12257. singledispatch单分发器用于实现泛型函数。根据单一参数的类型来判断调用哪个函数。from functools import singledispatch singledispatch def fun(text): print(String text) fun.register(int) def _(text): print(text) fun.register(list) def _(text): for k, v in enumerate(text): print(k, v) fun.register(float) fun.register(tuple) def _(text): print(float, tuple) fun(i am is hubo) fun(123) fun([a,b,c]) fun(1.23) print(fun.registry) # 所有的泛型函数 print(fun.registry[int]) # 获取int的泛型函数 # Stringi am is hubo # 123 # 0 a # 1 b # 2 c # float, tuple # {class object: function fun at 0x106d10f28, class int: function _ at 0x106f0b9d8, class list: function _ at 0x106f0ba60, class tuple: function _ at 0x106f0bb70, class float: function _ at 0x106f0bb70} # function _ at 0x106f0b9d88. singledispatchmethod与泛型函数类似可以编写一个使用不同类型的参数调用的泛型方法声明根据传递给通用方法的参数的类型编译器会适当地处理每个方法调用。class Negator: singledispatchmethod def neg(self, arg): raise NotImplementedError(Cannot negate a) neg.register def _(self, arg: int): return -arg neg.register def _(self, arg: bool): return not arg9. total_ordering它是针对某个类如果定义了lt、le、gt、ge这些方法中的至少一个使用该装饰器则会自动的把其他几个比较函数也实现在该类中from functools import total_ordering class Person: # 定义相等的比较函数 def __eq__(self,other): return ((self.lastname.lower(),self.firstname.lower()) (other.lastname.lower(),other.firstname.lower())) # 定义小于的比较函数 def __lt__(self,other): return ((self.lastname.lower(),self.firstname.lower()) (other.lastname.lower(),other.firstname.lower())) p1 Person() p2 Person() p1.lastname 123 p1.firstname 000 p2.lastname 1231 p2.firstname 000 print p1 p2 # True print p1 p2 # True print p1 p2 # False print p1 p2 # False print p1 p2 # False10. update_wrapper使用partial包装的函数是没有__name__和__doc__属性的。update_wrapper作用将被包装函数的__name__等属性拷贝到新的函数中去。from functools import update_wrapper def wrap2(func): def inner(*args): return func(*args) return update_wrapper(inner, func) wrap2 def demo(): print(hello world) print(demo.__name__) # demo11. wrapswarps函数是为了在装饰器拷贝被装饰函数的__name__。就是在update_wrapper上进行一个包装from functools import wraps def wrap1(func): wraps(func) # 去掉就会返回inner def inner(*args): print(func.__name__) return func(*args) return inner wrap1 def demo(): print(hello world) print(demo.__name__) # demo参考文献Python-functools详解 - 知乎Python的functools模块_Python之简的博客-CSDN博客_functoolsPython的Functools模块简介_函数cached_property/缓存属性_小二百的博客-CSDN博客盖若 gairuo.com

相关新闻

Claude Code 回复完成?让鼠标告诉你

Claude Code 回复完成?让鼠标告诉你

不只是提示音——用 RGB 鼠标做 Claude Code 的状态指示灯用 Claude Code 写代码时,经常切到其他窗口等回复。切回来早了打断推理,切晚了浪费时间。它自带的提示音一闪而过,很容易错过。我直接把桌面上那只吃灰的罗技 G102 改成了**物理状态灯…

2026/7/10 13:12:18阅读更多 →
食品经营许可证识别API接入详解:字段解析与curl示例

食品经营许可证识别API接入详解:字段解析与curl示例

适用场景 食品经营许可证是从事食品销售和餐饮服务的法定资质证件。在企业准入审核、供应商合规验证、平台商家入驻等业务中,人工录入证照信息效率低且易出错。通过API自动化识别证件上的关键字段,可以将业务处理时间从分钟级缩短到秒级,同时…

2026/7/10 13:12:18阅读更多 →
Claude Fable 5新功能全量实测报告(含27项基准对比数据):API延迟下降41%,上下文窗口突破200K tokens

Claude Fable 5新功能全量实测报告(含27项基准对比数据):API延迟下降41%,上下文窗口突破200K tokens

更多请点击: https://kaifayun.com 第一章:Claude Fable 5 发布背景与核心演进路径 Anthropic 在2024年第三季度正式发布 Claude Fable 5,标志着其从通用大语言模型向“可验证推理型智能体”范式的战略性跃迁。该版本并非简单参数量堆叠&…

2026/7/10 13:12:18阅读更多 →
(25-1)基于

(25-1)基于

在本章的内容中,图13-2 模块结构图

2026/7/10 14:07:33阅读更多 →
STM32L041C6驱动压电陶瓷发声器的低功耗警报方案

STM32L041C6驱动压电陶瓷发声器的低功耗警报方案

1. 项目背景与核心需求警报系统在各种环境下的可靠性直接关系到人身安全和设备保护。传统蜂鸣器在复杂环境中往往存在音量不足、音质失真等问题,特别是在工业噪声、户外风雨等干扰环境下表现不佳。EPT-14A4005P压电陶瓷发声器配合STM32L041C6低功耗MCU的方案&#x…

2026/7/10 14:07:33阅读更多 →
AD5593R与PIC18F2610硬件设计及固件优化实战

AD5593R与PIC18F2610硬件设计及固件优化实战

1. AD5593R与PIC18F2610的硬件协同设计 1.1 AD5593R的核心特性解析 AD5593R这颗芯片最吸引人的地方在于它的多功能引脚配置能力。每个引脚都可以通过软件配置为四种工作模式:12位DAC输出、12位ADC输入、数字输出或数字输入。这种灵活性意味着我们可以在不改变硬件连…

2026/7/10 14:07:33阅读更多 →
从 0 到 1:基于 Cursor 与 GPT-5/Claude 4 构建企业级智能重构平台

从 0 到 1:基于 Cursor 与 GPT-5/Claude 4 构建企业级智能重构平台

从 0 到 1:基于 Cursor 与 GPT-5/Claude 4 构建企业级智能重构平台项目背景在 2026 年的当下,随着大模型能力的指数级跃升,传统软件开发模式正经历剧烈震荡。我们团队负责的电商核心交易系统,历经五年迭代,积累了大量“…

2026/7/10 14:07:33阅读更多 →
如何用SPT-AKI存档编辑器解放你的塔科夫离线游戏体验

如何用SPT-AKI存档编辑器解放你的塔科夫离线游戏体验

如何用SPT-AKI存档编辑器解放你的塔科夫离线游戏体验 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/sp/SPT-AKI-Pr…

2026/7/10 14:07:33阅读更多 →
3步快速解决Windows多显示器DPI缩放难题的完整方案

3步快速解决Windows多显示器DPI缩放难题的完整方案

3步快速解决Windows多显示器DPI缩放难题的完整方案 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 你是否曾为Windows多显示器DPI缩放问题而烦恼?想象一下这样的场景:你正沉浸在工作中,4K主显示器上的…

2026/7/10 14:02:32阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/10 12:29:21阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/10 13:39:09阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →