前言:
作者简介:短尾巴小鳄鱼 ,一位不放弃自己的上进卷妹
💬 如果文章知识点有错误的地方,请留言指正~和大家一起学习,一起进步
💬 人生格言:昨日种种,皆成今我。今日种种,方成新我。切莫踌躇,莫停留,莫沉溺💬
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
比如,a函数是一个装饰器,将c函数在a函数中执行,在a函数中可以选择执行或不执行c函数,也可以对c函数的结果进行二次加工处理。
被装饰器装饰的函数不直接调用,而是作为一个参数传入装饰器中。
# 下面是一个装饰器,一个装饰器包含外围函数和内嵌函数
def out(func_args): # 外围函数
def inter(*args, **kwargs): # 内嵌函数,所有的业务都在内嵌函数中
return func_args(*args, **kwargs)
return inter 外围函数返回内嵌函数
普遍使用第二种方法
用法一:将被调用的函数直接作为参数传入装饰器的外围函数括弧内
例子:
# 下面是一个装饰器
def a(func):
def b(*args, **keargs):
return func(*args, **kwargs)
return b
def c(name):
print(name)
a(c)('xiaoming') # 将c函数放入装饰器a中执行
运行结果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCbb1G63-1658999339574)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728152329136.png)]](https://1000bd.com/contentImg/2022/08/01/042756032.png)
用法二:将装饰器与被调用函数绑定在一起,@符号+装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可
def a(func):
def b(*args, **kwargs):
return func(*args, **kwargs)
return b
@a # 将c函数与装饰器a绑定
def c(name):
print(name)
c('xiaoming') # 调用c函数时,将作为参数传入装饰器执行
运行结果与上面用法一一样
下面看一个例子帮助深入理解装饰器:
对函数的返回值进行检查:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ztjmiq8u-1658999339577)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728153343432.png)]](https://1000bd.com/contentImg/2022/08/01/042756227.png)
将类函数可以不经过实例化而直接被调用
用法:
@classmethod
def func(cls,...): # 注意,添加了这个装饰器,参数self需替换成cls,代表操作的是当前类
do
例子:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeuAQiad-1658999339578)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728155826760.png)]](https://1000bd.com/contentImg/2022/08/01/042756361.png)
在classmethod装饰的类函数内部是不可以调用self的类函数的,但在self类函数内部可以调用classmethod装饰的类函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrANbu17-1658999339579)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728161101897.png)]](https://1000bd.com/contentImg/2022/08/01/042757060.png)
将类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不许传递self或cls参数,且无法在该函数内部调用其他类函数或类属性
用法:
@staticmethod
def func(...): # 注意,添加了这个装饰器,参数无self和cls
do
例子:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwpwcMzA-1658999339580)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728165750844.png)]](https://1000bd.com/contentImg/2022/08/01/042757334.png)
将类函数的执行免去括弧,类似于调用属性
用法:
@property
def func(self):
do
例子:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydHxKqKX-1658999339581)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728170757418.png)]](https://1000bd.com/contentImg/2022/08/01/042757491.png)