一些关于python 装饰器的个人理解
作者:Wonz 发布时间:2021-11-27 21:41:33
装饰器
本质是一个接受参数为函数的函数。
作用:为一个已经实现的方法添加额外的通用功能,比如日志记录、运行计时等。
举例
1.不带参数的装饰器,不用@
# 不带参数的装饰器
def deco_test(func):
def wrapper(*args, **kwargs):
print("before function")
f = func(*args, **kwargs)
print("after function")
return f
return wrapper
def do_something(a,b,c):
print(a)
time.sleep(1)
print(b)
time.sleep(1)
print(c)
return a
if __name__ == '__main__':
# 不用@
f = deco_test(do_something)("1","2","3")
输出:
before function
1
2
3
after function
个人理解:
相当于在 do_something
函数外面套了两个输出: before function 和 after function 。
2.不带参数的装饰器,用 @
# 不带参数的装饰器
def deco_test(func):
def wrapper(*args, **kwargs):
print("before function")
f = func(*args, **kwargs)
print("after function")
return f
return wrapper
@deco_test
def do_something(a,b,c):
print(a)
time.sleep(1)
print(b)
time.sleep(1)
print(c)
return a
if __name__ == '__main__':
# 使用@
f = do_something("1","2","3")
输出:
before function
1
2
3
after function
个人理解:
相当于执行 do_something 函数的时候,因为有 @ 的原因,已经知道有一层装饰器 deco_test ,所以不需要再单独写 deco_test(do_something) 了。
3.带参数的装饰器
# 带参数的装饰器
def logging(level):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
f = func(*args, **kwargs)
print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
return f
return inner_wrapper
return wrapper
@logging(level="debug")
def do_something(a,b,c):
print(a)
time.sleep(1)
print(b)
time.sleep(1)
print(c)
return a
if __name__ == '__main__':
# 使用@
f = do_something("1","2","3")
输出:
[debug]: enter function do_something()
1
2
3
after function: [debug]: enter function do_something()
个人理解:
装饰器带了一个参数 level = "debug" 。
最外层的函数 logging() 接受参数并将它们作用在内部的装饰器函数上面。内层的函数 wrapper() 接受一个函数作为参数,然后在函数上面放置一个装饰器。这里的关键点是装饰器是可以使用传递给 logging() 的参数的。
4.类装饰器
# 类装饰器
class deco_cls(object):
def __init__(self, func):
self._func = func
def __call__(self, *args, **kwargs):
print("class decorator before function")
f = self._func(*args, **kwargs)
print("class decorator after function")
return f
@deco_cls
def do_something(a,b,c):
print(a)
time.sleep(1)
print(b)
time.sleep(1)
print(c)
return a
if __name__ == '__main__':
# 使用@
f = do_something("1","2","3")
输出:
class decorator before function
1
2
3
class decorator after function
个人理解:
使用一个装饰器去包装函数,返回一个可调用的实例。 因此定义了一个类装饰器。
5.两层装饰器
# 不带参数的装饰器
def deco_test(func):
def wrapper(*args, **kwargs):
print("before function")
f = func(*args, **kwargs)
print("after function")
return f
return wrapper
# 带参数的装饰器
def logging(level):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
f = func(*args, **kwargs)
print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
return f
return inner_wrapper
return wrapper
@logging(level="debug")
@deco_test
def do_something(a,b,c):
print(a)
time.sleep(1)
print(b)
time.sleep(1)
print(c)
return a
if __name__ == '__main__':
# 使用@
f = do_something("1","2","3")
输出:
[debug]: enter function wrapper()
before function
1
2
3
after function
after function: [debug]: enter function wrapper()
个人理解:
在函数 do_something() 外面先套一层 deco_test() 装饰器,再在最外面套一层 logging() 装饰器。
来源:https://my.oschina.net/wonz/blog/4536523?utm_source=tuicool&utm_medium=referral
猜你喜欢
- 本文实例讲述了Python二叉树定义与遍历方法。分享给大家供大家参考,具体如下:二叉树基本概述:二叉树是有限个元素的几个,如果为空则为空二叉
- 淘宝的页面很复杂,如果使用分析ajax或者js的方式,很麻烦抓取淘宝‘美食'上面的所有食品信息spider.py#encoding:
- 说完了理论,我们来做点实事。这篇文章将介绍使用 Javascript 实现的动画组件。下面记录下当时编写这个组件的考虑的些问题,对技术细节感
- 这不仅仅是一个信息 * 的时代,也是一个服务 * 的时代。一切都是因为互联网,随着互联网技术的发展,信息的增多,服务的增多,用户需求的多样化。怎
- SQL Server的以前版本在跟踪对象相关性方面做的并不好。原因是所有的对象相关性都是由对象ID来跟踪的,这意味着对象一开始就必须存在。但
- python如何将字母转化为数字?将英文字母转成数字:转换ord('F')反转chr(70)python ord() 函数是
- 那么在集合函数中它有什么用呢 ?假设数据库有一张表名为student的表。如果现在要你根据这张表,查出江西省男女个数,广东省男生个数,浙江省
- 问题描述最近~ 发现对series里的元素操作挺复杂的,用for loop + Series.iloc[i]会发生卡死的状况,那么,lamb
- 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下:1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五
- SQL Server的作业调度来建立自动备份的方法◆1、进入企业管理器中->管理->sql server代理->作业;◆2
- 在win10环境下搭建python3.5.2和tensorflow平台,供大家参考,具体内容如下操作步骤如下:1、官网(https://ww
- 内连接(inner join)。 外连接: 全连接(full join)、左连接(left join)、右连接(right join)。 交
- 一、 什么是进程 / 线程1、 引论众所周知,CPU是计算机的核心,它承担了所有的计算任务。而操作系统是计算机的管理者,是一个大管家,它负责
- int(x, [base])功能:函数的作用是将一个数字或base类型的字符串转换成整数。函数原型:int(x=0)int(x, base=
- 本文实例讲述了python将文本转换成图片输出的方法。分享给大家供大家参考。具体实现方法如下:#-*- coding:utf-8 -*-fr
- this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。和其他
- 今天在继续学习Python时,打开Pycharm后,发现有一个项目下的项目文件名是红色的,如下图:刚开始我以为是我升级 Pycharm导致的
- 一、分析数据源这里的数据源是指html网页?还是Aajx异步。对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍。提示:以下操作
- 微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋
- <?php interface js{ function ys($a,$b); } class Af implements js{ f