5.1 装饰器的使用场景
- 函数执行时间的统计
- 输出日志信息
5.2 装饰器实现已有函数执行时间的统计
import time
def decorator(func):
def inner():
# 获取时间距离1970-1-1 0:0:1的时间差
begin = time.time()
func()
end = time.time()
result = end - begin
print(f'函数执行完成耗时:{result}')
return inner
@decorator
def work():
for i in range(10000):
print(i)
work()
6. 通用装饰器的使用
通用装饰器:可以装饰任意类型的函数
使用装饰器装饰已有函数的时候,内部函数的类型和要装饰的已有函数的类型保持一致
6.1 装饰带有参数的函数
def decorator(func):
def inner(num1, num2):
print('正在努力执行加法计算')
func(num1, num2)
return inner
@decorator
def add\_num(num1, num2):
result = num1 + num2
print(f'结果为:{result}')
add_num(1, 2)
6.2 装饰带有参数、返回值的函数
def decorator(func):
def inner(num1, num2):
print('正在努力执行加法计算')
num = func(num1, num2)
return num
return inner
@decorator
def add\_num(num1, num2):
result = num1 + num2
return result
result = add_num(1, 2)
print(f'结果为:{result}')
6.3 装饰带有不定长参数、返回值的函数
def decorator(func):
def inner(\*args, \*\*kwargs):
print('正在努力执行加法计算')
# \*args:把元组里面的每一个元素,按照位置参数的方式进行传参
# \*\*kwargs:把字典里面的每一个键值对,按照关键字的方式进行传参
num = func(\*args, \*\*kwargs)
return num
return inner
@decorator
def add\_num(\*args, \*\*kwargs):
result = 0
for value in args:
result += value
for value in kwargs.values():
result += value
return result
result = add_num(1, 2, a=3)
print(f'结果为:{result}')
7. 多个装饰器的使用
多个装饰器的装饰过程:由内到外的一个装饰过程,先执行内部的装饰器,在执行外部的装饰器。
def make\_div(func):
print('make\_div装饰器执行了')
def inner():
result = '<div>' + func() + '</div>'
return result
return inner
def make\_p(func):
print('make\_p装饰器执行了')
def inner():
result = '<p>' + func() + '</p>'
return result
return inner
# 原理剖析:content = make\_div(make\_p(content))
# 分布拆解:content = make\_p(content),内部装饰器完成,content = make\_p.inner
# content = make\_div(make\_p.inner)
@make_div
@make_p
def content():
return '人生苦短,我用python'
c = content()
print(c)
make_p装饰器执行了
make_div装饰器执行了
<div><p>人生苦短,我用python</p></div>
8. 带有参数的装饰器
带有参数的装饰器就是使用装饰器装饰函数的时候可以传入指定参数,语法格式: @装饰器(参数,…)
使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回是装饰器,因为 @ 符号需要配合装饰器实例使用。
def return\_decorator(flag):
# 装饰器只能接收一个参数并且是函数类型
def decorator(func):
def inner(a, b):
if flag == '+':
print('正在努力执行加法计算')
elif flag == '-':
print('正在努力执行减法计算')
func(a, b)
return inner
# 当调用函数的时候可以返回一个装饰器decorator
return decorator
@return_decorator('+') # decorator = return\_decorator('+'), @decorator => add\_num = decorator(add\_num)
def add\_num(a, b):
result = a + b
print(result)
@return_decorator('-')
def sub\_num(a, b):
result = a - b
print(result)
add_num(1, 2)
sub_num(1, 2)
正在努力执行加法计算
3
正在努力执行减法计算
-1
9. 类装饰器的使用
类装饰器:使用类装饰已有函数
class MyDecorator(object):
def \_\_init\_\_(self, func):
self.__func = func
# 实现\_\_call\_\_方法,表示对象是一个可调用对象,可以像调用函数一样进行调用
def \_\_call\_\_(self, \*args, \*\*kwargs):
# 对已有函数进行封装
print('马上就有下班啦')
self.__func()
@MyDecorator # @MyDecorator => show = MyDecorator(show)
def show():
print('快要下雪啦')
# 执行show,就相当于执行MyDecorator类创建的实例对象,show() => 对象()
show()
马上就有下班啦
快要下雪啦
扩展:
函数之所以能够调用,是因为函数内部实现了 __call__
方法
10. 应用场景
收集函数的操作或错误日志记录
验证函数的使用权限
计算函数的运行时间
在ORM/DB模型操作时,通过属性方法动态地获取关联的数据
函数数据的缓存
定制函数的输入和输出(序列化和反序列化)
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。