装饰器 decorator
Python 中,在函数或类的定义前,可以使用 @ 符号为它们加上一个装饰器(decorator)。
原理
例如以下代码中,为函数 f 添加了 triple 装饰器:
def triple(f):
print("triple is called")
def wrapper(*args, **kwargs):
print('wrapper is called.')
return 3 * f(*args, **kwargs)
return wrapper
@triple
def f(x: int) -> int:
return x ** 2
下面带上装饰器 @triple 的函数,实质上(在字节码上)等价于:
def f(x: int) -> int:
return x ** 2
f = triple(f)
也就是说,装饰器会在函数定义好之后,将函数作为实参传入装饰器函数,经过装饰器处理再返回。
从数学上看,装饰器就是一个作用于函数的算子,它将一个函数变换为另一个函数。
应用
装饰器可以用于函数的注册。例如,PaddleSeg 通过 manager 来管理神经网络,其简化原理如下:
class Manager:
def __init__(self, **kwargs):
self.nets = []
...
def add(self, net):
self.nets.append(net)
return net
networks_manager = Manager()
此时,新定义的网络便可以通过装饰器 decorator 进行定义:
@networks_manager.add
class UNet(nn.Layer):
...
这样,这个类被定义好后,就会传入 networks_manager.add 函数。新定义的网络就可以通过装饰器来注册。
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表