python——装饰器

本文详细介绍了Python装饰器的概念,包括基本用法、嵌套使用、带参数的装饰器以及面向对象的装饰器。通过实例展示了如何使用装饰器进行权限校验、日志记录等功能,并探讨了装饰器在函数和类方法中的应用。装饰器是Python中强大的工具,能够增强代码的可读性和可维护性。
摘要由CSDN通过智能技术生成


在这里插入图片描述

1.装饰器

image-20220417220005617

def check(func):
    
	def checkAndLog():
		print("函数运行前:权限校验...")
		func()
		print("函数运行后:日志记录...")
        
	return checkAndLog

def printInfo():
	print("我是一个普通的函数")
newFunc = check(printInfo) #返回内部函数
newFunc() #执行内部函数
# printInfo()

输出结果:
函数运行前:权限校验…
我是一个普通的函数
函数运行后:日志记录

使用装饰器

def check(func):
    
	def checkAndLog():
		print("函数运行前:权限校验...")
		func()
		print("函数运行后:日志记录...")
        
	return checkAndLog

@check       #定义装饰器修饰的位置,相当于check(printInfo)
def printInfo():
    print("我是一个普通的函数")
   
@check
def test():
	print("test....")
    
printInfo() #执行函数前,会先执行装饰器
test()

输出结果:
函数运行前:权限校验…
我是一个普通的函数
函数运行后:日志记录…
函数运行前:权限校验…
test…
函数运行后:日志记录…

2.装饰器的嵌套

def zsA(func):
	def resFunc():
		print("zsA执行前...")
		func()
		print("zsA执行后...")
	return resFunc
def zsB(func):
	def resFunc():
		print("zsB执行前...")
		func()
		print("zsB执行后...")
	return resFunc

@zsB
@zsA 	#自下而上逐步修饰,完成后一次性输出
def test():
	print("这是测试函数")
test()


#相当于:
res1 = zsA(test)
res2 = zsB(res1)
res2()

image-20220417222354778

3.带有参数的装饰器

如果原函数带有参数,那么返回的新函数也要带有参数,且参数一一对应

def tool(func):
    def log(name,pwd):
        print(f"日志记录:【{name}:{pwd}】")
        #接收func()函数的返回值
        state=func(name,pwd)
        return state
    return log


@tool
def login(name,pwd):
    print(f"用户名:{name},密码:{pwd}")
    if name=="admin" and pwd==123456:
        return "登录成功"
    return "登录失败"

ls=login("admin",123456)
print(ls)

image-20220417231628612

def tool(func):
    #最常使用的方法
    def log(*args,**kwargs):
        print(f"日志记录前.......")
        state=func(*args,**kwargs)
        print(f"日记记录后.......")
        return state
    return log


@tool
def login(name,kwd):
    print(f"用户名:{name},密码:{pwd}")
    if name=="admin" and pwd==123456:
        return "登录成功"
    return "登录失败"

ls1=login("admin",123456)
print(ls1)
ls2=test()
print(ls2)

image-20220417234325975

4.面向对象的装饰器

class MyTool:
    #当MyTool当作函数调用时,call自动被调用
    def __call__(self,func):
        #去找到类里面的tool2,再调用tool2(func)
    	return self.tool2(func)
    	
    def tool1(func):
        def log():
            print("log....")
            func()
         return log
	
    #调用tool2,返回值是check
    def tool2(self,func):
        def check():
            print("check....")
            func()
         return check

#调用方法一:
@MyTool.tool1
def test():
    print("test....")
test()



#调用方法二
@MyTool()  #通过函数的方式调用MyTool,可以自动触发call内置函数
def test():
    print("test....")
test()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值