python装饰器

    技术2022-07-10  215

    什么是装饰器

    装饰器本质上是一个函数,可以对原有的函数进行功能增加,而不破坏原有的函数,即不侵入原有的函数。

    装饰器的写法

    1、未使用装饰器的写法

    def add(x, y): print("===Call add function===") return x + y # 柯里化 def process(fn): def _call(*args, **kwargs): print("+++Call wrapper function+++") return fn(*args, **kwargs) return _call # 函数调用 add = process(add) print(add(1, 2)) # 3

    2、使用装饰器

    (1) 无参装饰器

    def process(fn): def wrapper(*args, **kwargs): print("+++Call wrapper function+++") return fn(*args, **kwargs) return wrapper @process # 等价于: add = process(add) def add(x, y): print("===Call add function===") return x + y # 调用过程 print(add(1, 2)) # 3

    装饰器函数接收的必须是一个函数对象,返回的也必须是一个函数对象。

    (2) 带参装饰器

    def process(num): def decorator(fn): def wrapper(*args, **kwargs): if num >= 5: return fn(*args, **kwargs) + num return fn(*args, **kwargs) return wrapper return decorator @process(6) # process(6)<=>decorator 所以整个相当于@decorator,然后等价于add = decorator(add) def add(x, y, z=3): return x + y + z # 调用 print(add(1, 2, 3)) # 12

    (3) 类装饰器

    i、无参的使用情况

    class Process(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): return self.func(*args, **kwrags) @Process def add(x, y): return x + y # 调用 print(add(1, 2))

    ii、带参数的情况

    class Decorator(object): def __init__(self, num): self.num = num def __call__(self, fn): def wrapper(*args, **kwargs) if self.num >= 5: return fn(*args, **kwargs) + self.num return fn(*args, **kwargs) return wrapper @Decorator(5) def add(x, y): return x + y
    =======未完待续=
    Processed: 0.052, SQL: 9