服饰工厂网站建设,通证电商平台现在有哪些,万户网络技术,咖啡建设网站的目的分类目录#xff1a;《系统学习Python》总目录 在《系统学习Python——装饰器》系列文章中#xff0c;我们的大多数示例都设计来拦截函数和实例创建调用。这对于装饰器来说很典型#xff0c;但是它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类#xff…分类目录《系统学习Python》总目录 在《系统学习Python——装饰器》系列文章中我们的大多数示例都设计来拦截函数和实例创建调用。这对于装饰器来说很典型但是它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类从而有效地工作它们也可以用来管理函数和类对象自身而不只是管理对它们随后的调用。
例如假设我们需要将被另一个应用程序使用的方法或类注册到一个API上以便随后处理可能该API会调用该对象以响应事件。我们可以提供一个注册函数在对象定义之后手动地调用该函数但装饰器使得你的意图更为明显。
这一思路的一种简单实现如下其中定义了一个装饰器它既应用于函数也应用于类并把对象添加到一个基于字典的注册表中。由于它返回对象本身而不是一个包装器因此它没有拦截随后的调用
registry {}
def register(obj):registry[obj.__name__] objreturn objregister
def square(x):return x**2register
def cube(x):return x**3register
class Eggs:def __init__(self, x):slf.data xdef __str__(self):return str(self.data)for name in registry:print(name, , registry[name])输出
square function square at 0x00000267F2E36700
cube function cube at 0x00000267F49B3790
Eggs class __main__.Eggs当这段代码运行的时候被装饰的对象按照名称添加到注册表中但当随后调用它们的时候它们仍然按照最初的编写方式工作而没有指向一个包装器层。实际上我们的对象可以手动运行或从注册表内部运行。
例如一个用户界面可能使用这样的技术为用户动作注册回调处理程序。处理程序可能通过数或类名来注册就像这里所做的一样或者可以使用装饰器参数来指定主体事件包围装饰器的一条额外的def语句可能会用来保持这样的参数以便在装饰时使用。
这个例子是编造的但是其技术很通用。例如函数装饰器也可能用来处理函数属性并且类装饰器可能动态地插人新的类属性甚至新的方法。考虑如下的函数装饰器一一一它们分配函数属性来记录随后某个API的使用信息但是它们没有插人一个包装器层来拦截随后的调用
def decorate(func):func.marked Truereturn funcdecorate
def spam(x, y):return x yspam.marked输出
True输入
def annotate(text):def decorate(func):func.label textreturn funcreturn decorateannotate(spam data)
def spam(x, y):return x yspam(1, 1), spam.label输出
(2, spam data)这样的装饰器直接扩展了函数和类但没有捕捉对它们的随后调用。我们将在后面的文章见到多的管理类的类装饰的例子因为这证明了它已经转向了元类的领域。
参考文献 [1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.