python基础知识整理——装饰器

最简装饰器

def deco(func):
    def wrap(*args, **kwargs):
        return func(*args, **kwargs)
    return wrap
​
@deco
def foo(a, b):
    return a ** b

原理
对比被装饰前后的 foo.__name__foo.__doc__

from functools import wraps
​
def deco(func):
    '''i am deco'''
    @wraps(func)  # 还原被装饰器修改的原函数属性
    def wrap(*args, **kwargs):
        '''i am wrap'''
        return func(*args, **kwargs)
    return wrap

简单过程

fn = deco(func)
foo = fn
foo(*args, **kwargs)

多个装饰器叠加调用的过程

  @deco1
        @deco2
        @deco3
        def foo(x, y):
            return x ** y

​
# 过程拆解 1
fn3 = deco3(foo)
fn2 = deco2(fn3)
fn1 = deco1(fn2)
foo = fn1
foo(3, 4)
​
# 过程拆解 2
# 单行: deco1( deco2( deco3(foo) ) )(3, 2)
deco1(
    deco2(
        deco3(foo)
    )
)(3, 4)

带参数的装饰器

def deco(n):
    def wrap1(func):
        def wrap2(*args, **kwargs):
            return func(*args, **kwargs)
        return wrap2
    return wrap1
​
# 调用过程
wrap1 = deco(n)
wrap2 = wrap1(foo)
foo = wrap2
foo()
​
# 单行形式
check_result(30)(foo)(4, 8)

装饰器类和 call

class Deco:
    def __init__(self, func):
        self.func = func
​
    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)
​
@Deco
def foo(x, y):
    return x ** y
​
# 过程拆解
fn = Deco(foo)
foo = fn
foo(12, 34)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值