python——装饰器

python——装饰器,第1张

文章目录
      • 1.装饰器
      • 2.装饰器的嵌套
      • 3.带有参数的装饰器
      • 4.面向对象的装饰器

1.装饰器

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()

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)

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)

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()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/715282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存