计算机

装饰器 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

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表