Python 装饰器

在函数名以及函数体不改变的前提下,给一个函数附加一些额外的代码。
面向对象,具有开放封闭原则,已经写好的代码,尽可能不要修改。如果想要新增功能,在原先代码基础上,单独进行扩展。
函数应该具有单一职责

def checkLogin(func):
    def inner():
        print('登录验证')
        func()
    return inner

def fss():
    print('发说说')

fss = checkLogin(fss)

def ftp():
    print('发图片')

ftp = checkLogin(ftp)

btnIndex = 1
if btnIndex == 1:
    fss()
else:
    ftp()

登录验证
发说说

checkLogin可以认为是装饰器。

语法糖

@checklogin

def checkLogin(func):
    def inner():
        print('登录验证')
        func()
    return inner

@checkLogin
def fss():
    print('发说说')

# fss = checkLogin(fss)

@checkLogin
def ftp():
    print('发图片')

# ftp = checkLogin(ftp)

btnIndex = 1
if btnIndex == 1:
    fss()
else:
    ftp()

执行时间

装饰器的执行时间是立即执行

def check(func):
    print('xxx')
    def inner():
        print('登录验证')
        func()
    return inner

@check
def fss():
    print('发说说')

# fss = check(fss)

xxx

装饰器叠加

从上到下装饰,从下到上执行

def zhuangshiqi_line(func):
    def inner():
        print('--------------------')
        func()
    return inner

def zhuangshiqi_star(func):
    def inner():
        print('*' * 30)
        func()
    return inner

@zhuangshiqi_line
@zhuangshiqi_star
def print_content():
    print('社会我顺哥')

print_content()

--------------------
******************************
社会我顺哥

对有参数的函数进行装饰

无论什么场景,保证函数调用参数个数一致,为了通用,可以使用不定长参数,结合拆包操作进行处理

def zsq(func):
    def inner(*args, **kwargs):
        print('_' * 30)
        print(args, kwargs)
        func(*args, **kwargs)
    return inner

@zsq
def pnum(num, num2, num3):
    print(num, num2, num3)

@zsq
def pnum2(num):
    print(num)

pnum(123, 222, num3=666)
pnum2(999)

______________________________
(123, 222) {‘num3’: 666}
123 222 666
______________________________
(999,) {}
999

对有返回值的函数进行装饰


def zsq(func):
    def inner(*args, **kwargs):
        print('_' * 30)
        print(args, kwargs)
        res = func(*args, **kwargs)
        return res
    
    return inner

@zsq
def pnum(num, num2, num3):
    print(num, num2, num3)
    return num + num2 + num3

@zsq
def pnum2(num):
    print(num)

res1 = pnum(123, 222, num3=666)
res2 = pnum2(999)

print(res1, res2)

______________________________
(123, 222) {‘num3’: 666}
123 222 666
______________________________
(999,) {}
999
1011 None

带有参数的装饰器

def getzsq(char):
    def zsq(func):
        def inner():
            print(char * 30)
            func()
        
        return inner
    
    return zsq

@getzsq('*')
def f1():
    print('666')

f1()

******************************
666

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值