网站首页 > 资源文章 正文
函数装饰器有事半功倍的力量。
Wallhaven 提供 图片
“简胜于繁。”
Python函数装饰器是“Python zen”哲学的最佳特性。
装饰器助力用更少、更简单的代码来实现复杂的逻辑,并在其他地方实现重用。
有许多很棒的内置Python装饰器使编码变得更为容易,只使用一行代码便可向当前的函数或类中添加复杂的函数。
行胜于言,接下来,来看看精心挑选的9个函数装饰器,它将展示Python的优雅。
@lru_cache:利用缓存提速程序
使用@lru_cache装饰器是提速Python函数最简易的方法
此装饰器将函数的结果放入缓存,供后续具有相同参数的函数调用,无需再次执行具有相同参数的函数。
对于那些算力成本高昂或常用相同参数函数的调用特别有用。
来看看以下直观的示例:
上述程序用Python函数计算第n个Fibonacci数,这个函数非常耗时,当计算fibonacci(30)时,在递归过程中需要多次计算先前的Fibonacci数。
用@lru_cache装饰器来对它进行提速:
正如上述代码所示,使用@lru_cache装饰器后,可以在0.00002990秒内得到相同的结果,比先前的0.18129450秒快了不少。
@lru_cache装饰器有一个“最多结果数目”参数,该参数指定要在缓存中存储的最大结果数目。当缓存已满且需要存储新结果时,会将最近使用得最少的结果从缓存中删除,为新缓存腾出空间,称之为最近最不常用策略(LRU)。
默认情况下,将“最多结果数目”设为128。如果设为None,则禁用 LRU特性,缓存可以无约束地增长。
@total_ordering: 填充缺失排序方法的类装饰器
函数工具模块中的@total_sordeng装饰器为预定义Python类生成缺失比较方法。
下面为示例程序:
如上述代码所示,在学生类中没有对__ge__、__gt__和__le__方法进行定义,多亏有了@total_order装饰器,不同实例之间的比较结果均正确。
该装饰器的好处显而易见:
- 可以使代码更干净,节省时间,因为无需编写全部比较方法。
- 一些旧的类可能未充分定义比较方法,将@total_ordering装饰器添加到其中之后,后续的使用更加安全。
@contextmanager:定制的语境管理器
Python有一个语境管理器机制助力正确地管理资源。
大多数情况下,只需要使用with声明:
如上述代码所示,可以使用with语句打开文件,在写入之后将自动关闭。无需显式地调用f.close()函数来关闭该文件。
有时,需要为某些特定需求定义一个自定义的语境管理器,此时,@contextmanager装饰器便成为了我们的朋友。
例如,下述代码实现了一个简单的自定义语境管理器,它可以在文件打开或关闭时打印出相应的信息。
@property:为Python类设置处理程序和设置程序
Getters和Setters是面向对象编程(OOP)中的重要概念。
对于类中的每个实例变量,getter方法返回其值,而setter方法设置或更新其值。鉴于此,Getters和Setters又分别称为Accessors和Mutators。
它们用于保护数据不被直接意外访问或修改。
不同的OOP语言有不同的机制来定义获取器getters和setters。在Python中,可以简单地使用@property装饰器。
如上述示例所示,无法将分数变量设置为999,这是一个毫无意义的数字。因为@property装饰器的设置函数中限制了分数的可接受范围。
毫无疑问,添加这个setter可以成功地避免意外的错误和结果。
@cached_property:将方法的结果作为属性放入缓存
Python 3.8的函数工具模块引入了一个新的功能强大的装饰器-@cached_property,它将类的方法转换为一个属性,计算出该属性的值之后,将其作为实例的普通属性放入缓存。
下面是这个示例:
在上述代码中,利用@cached_property来装饰局部方法,无需重复计算circle.area示例。
@classmethod:定义新的Python类方法
Python类中有三种方法类型:
- Instance methods(实例方法):绑定一个实例的方法,利用这种方法可以访问和修改实例数据。通过类的实例调用实例方法,通过self参数访问实例数据。
- Class methods(类方法):绑定一个类的方法,无法利用该方法修改实例数据。是调用类自身的一种方法,它将类作为第一个参数,通常将其命名为cls。
- Static methods(静态方法):不绑定实例或类的方法。
可以将实例方法定义成普通的Python函数,它的第一个参数是自身;如果需要定义一个类方法,则需要使用@classmethod装饰器。
为了演示,下面的示例定义了一个类方法,可以用它来根据直径获得一个圆:
@staticmethod:为Python类定义静态方法
如前所述,静态方法不绑定到实例或类,仅仅因为它们在逻辑上属于那个类,才被包含进来。
静态方法通常用于执行一组相关任务的实用程序类中,如数学计算。通过将相关函数组织成类的静态方法,使代码变得更加有组织、更容易理解。
使用@staticmethod装饰器便可以定义一个静态方法,来看看下面这个例子:
@dataclass:用更少的代码定义专用类
@dataclass装饰器(在Python3.7中引入)可以自动为一个类生成几种专用的方法,如__init__、__repr__、__eq__、__lt__等。
因此,它可以节省大量编写这些基本方法的时间。如果一个类主要用于存储数据,那么@dataccass装饰器是最好的朋友。
为了进行演示,下面的示例只定义了一个名为Point类的两个数据字段,@dataclass装饰器就够用了:
@atexit.register:注册一个程序正常终止的函数
atexit模块的@register装饰器允许在Python解释器退出时执行一个函数。
该装饰器对于执行最终的任务非常有用,比如释放资源或说“再会”!
下面是这个示例:
输出如下:
如示例所示,由于使用了@register装饰器,即使没有明确地调用“再会”函数,终端也打印出了“再会!”。
感谢拔冗阅读。
猜你喜欢
- 2025-03-12 JavaScript 装饰器:从入门到进阶
- 2025-03-12 深入浅出Python装饰器:让代码魔法般升级的秘籍
- 2025-03-12 微信隐藏表白代码大全,微信满屏表情代码,万圣节表白专场
- 2025-03-12 你还在用Excel做大屏吗?这几款工具做大屏很不错
- 2025-03-12 解锁鸿蒙装饰器:应用、原理与优势全解析
- 2025-03-12 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 2025-03-12 python闭包和装饰器详解
- 2025-03-12 Python快速入门教程11:高级特性之装饰器
- 2025-03-12 Ollama简明教程
- 2025-03-12 手把手教你用DeepSeek+即梦AI制作专属情人节海报
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)