Python基础5——装饰器

13、装饰器

其本质:在不需要做任何代码变动的前提下增加额外的功能。装饰器返回的是一个函数对象。

相当于把函数作为参数传递进去,然后对函数进行装饰

其本质就是一个闭包

作用:

  1. 原来的函数增加额外的功能
  2. 原来的函数作为参数传递进去

13.1 基本用法

标准版的装饰器

1def wrapper(func): #func为原来的函数名 2 def inner(*agrs,**kwargs): 3 # 执行被装饰函数之前的操作 4 ret = func(*agrs,**kwargs) 5 # 执行被装饰函数之后的操作 6 return ret 7 return inner 8
1def test(): 2 print("发表评论:很喜欢~") 3 4#test() 5 6 7def wrapper(func): #外函数 , func为原来的函数名 8 def inner(): #内函数 9 print("是否登录:已经登录") 10 ret = func() #调用func函数 11 print("是否退出") 12 return ret 13 return inner 14 15new_test = wrapper(test) 16new_test()

13.2 语法糖用法 @装饰器名称

​ 用法

​ @装饰器名称

1 2def wrapper(func): 3 def inner(): 4 print("是否已经登录") 5 func() 6 return inner 7 8 9@wrapper #wrapper为装饰器的名称,就是一个函数 10#被装饰的函数 11def test2(): 12 print("转发微博") 13 14 15@warpper 16def test3(): 17 print("发微博") 18 19test() 20# 结果 21# 是否已经登录 22# 转发微博 23test3() 24# 结果 25# 是否已经登陆 26# 发微博
1def wrapper(func,fn): 2 def inner(): 3 print("最开始") 4 func() 5 fn() 6 return inner 7 8def test2(): 9 print("转发微博") 10def test3(): 11 print("发微博") 12 13new_test = wrapper(test1,test2) 14new_test()

13.3 带参数的装饰器

使用语法糖的方式

1 2def outer(fn): 3 def inner(a,b): 4 print(f'{a},{b}') 5 fn(a,b) 6 return inner 7 8@outer 9def test(a,b): #要有两个参数 10 print("hello") 11 12 13test(1,2)

不使用语法糖的方式

1 2def outer(fn): 3 def inner(a,b): 4 print(f'{a},{b}') 5 fn() 6 return inner 7 8def test(): 9 print("hello") 10 11test = outer(test) 12test(1,2)

13.4 带不定长参数的装饰器

1 2def test(*args, **kwargs): 3 print(args) 4 print(kwargs) 5 6def wrapper(func): 7 def inner(*args, **kwargs): 8 print("开始") 9 func(*args, **kwargs) 10 print("结束") 11 return inner 12 13test = wrapper(test) 14test() 15 16

13.5 多个装饰器

1 2# 第一个装饰器 3def maketest1(fn): 4 def inner(): 5 return "你好啊" + fn() + '结束' 6 return inner 7 8# 第二个装饰器 9def maketest2(fn): 10 def inner(): 11 return "第二个" + fn() + "第二个结束" 12 return inner 13 14# 被装饰的第一个函数 15@maketest1 16def test1(): 17 return "留下来补课" 18 19print(test1()) 20 21 22# 被装饰的第二个 23@maketest2 24def test2(): 25 return "我要改名了" 26print(test2()) 27 28# 被装饰的第三个 29@maketest1 #再用maketest1进行装饰 30@maketest2 #先用maketest2进行装饰 31def test3(): 32 return "江湖没有传说" 33print(test3()) 34
点赞
收藏

评论区

加载中...

相关推荐

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

恶补了 Python 装饰器的六种写法,你随便问~

大家好,我是明哥。今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解。Hello,装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰

浅析装饰器的那些事儿

一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实例理解(1)不

浅析装饰器的那些事儿

一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实

Python何时执行装饰器

装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这通常是在导入时(即Python加载模块时),如示例72中的registration.py模块所示。  示例72registration.py模块registrydefregister(func):print(

Python进阶笔记(2)

'''装饰器装饰器(Decorators)是Python的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短。如果已经接触过FLASK的,想想路由功能。如果没有接触过FLASK的,建议学习下。''''''各种推导式(compre