返回介绍

装饰器和元类:第一部分

发布于 2024-01-29 22:24:15 字数 1262 浏览 0 评论 0 收藏 0

因为上一节所说的staticmethod调用技术,对有些人来讲似乎很奇怪。因此新增了一个功能,要让这个运算变得简单一点。函数装饰器(function decorator)提供了一种方式,替函数明确了特定的运算模式,也就是将函数包裹了另一层,在另一函数的逻辑内实现。

函数装饰器变成了通用的工具:除了静态方法用法外,也可用于新增多种逻辑的函数。例如,可以用来记录函数调用的信息和在出错时检查传入的参数类型等。从某种程度上来说,函数装饰器类似于第30章讨论过的委托设计模式,但是其设计是为了增强特定的函数或方法调用,而不是整个对象接口。

Python提供一些内置函数装饰器,来做一些运算,例如,标识静态方法,但是程序员也可以编写自己的任意装饰器。虽然不限于使用类,但用户定义的函数装饰器通常也写成类,把原始函数和其他数据当成状态信息。在Python 2.6和Python 3.0中,也有更新的相关扩展可用:类装饰器直接绑定到类模式,并且它们的用途与元类有所重叠。

函数装饰器基础

从语法上来讲,函数装饰器是它后边的函数的运行时的声明。函数装饰器是写成一行,就在定义函数或方法的def语句之前,而且由@符号、后面跟着所谓的元函数(metafunction)组成:也就是管理另一函数(或其他可调用对象)的函数。例如,如今的静态方法可以用下面的装饰器语法编写。

从内部来看,这个语法和下面的写法有相同效果(把函数传递给装饰器,再赋值给最初的变量名)。

结果就是,调用方法函数的名称,实际上是触发了它staticmethod装饰器的结果。因为装饰器会传回任何种类的对象,这也可以让装饰器在每次调用上增加一层逻辑。装饰器函数可返回原始函数,或者新对象(保存传给装饰器的原始函数,这个函数将会在额外逻辑层执行后间接地运行)。

经过这些添加,有了在Python 2.6或Python 3.0中编写前一节中的静态方法示例的一种更好的方法(classmethod装饰器以同样的方式使用):

记住,staticmethod仍然是一个内置函数;它可以用于装饰语法中,只是因为它把一个函数当做参数并且返回一个可调用对象。实际上,任何这样的函数都可以以这种方式使用,即便是下节介绍的我们自己编写的用户定义函数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文