一、装饰器的语法:
@装饰器
开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
二、装饰器的作用:
在不更改原功能函数内部代码,并且不改变调用方法的情况下为原代码添加新的功能。
三、装饰器的原理:
@decorator 等同于 ===> work1 = decorator(work1)
四、普通装饰器
def decorator(func):
def wrapper():
print("---开机,打开软件--")
func()
print("---关机,底薪到手---")
return wrapper
@decorator# 作用 @decorator 等同于 ===> work1 = decorator(work1)
def work1():
print("----写代码---")
work1()
五、装饰有参数和返回值的餐宿
5-1:实现传参
import time
def count_time(func):
def wrapper(a,b):
strat_time = time.time()
func(a,b)
end_time = time.time()
t_time = end_time - strat_time
print('运行总时间:%s' % t_time)
return wrapper
@count_time
def work(a,b):
time.sleep(2)
e = a + b
return e
d = work(2,3)
print(d)

5-2:实现被装饰函数返回值
调用功能函数,接收功能函数返回的结果,装饰器执行完返回结果
def count_time(func):
def wrapper(a,b):
# 获取开始时的时间
strat_time = time.time()
result = func(a,b)
end_time = time.time()
t_time = end_time - strat_time
print('运行总时间:%s' % t_time)
return result
return wrapper
@count_time
def work(a,b):
time.sleep(2)
e = a + b
return e
d = work(2,3)
print(d)

六:装饰器装饰类
"""
闭包形式的装饰器装饰类:可以在类实例对象的时候,进行功能扩展
"""
"""
闭包形式的装饰器装饰类:可以在类实例对象的时候,进行功能扩展
"""
def decorator(item):
def wrapper(*args,**kwargs):
print("装饰器扩展代码1")
result = item(*args,**kwargs)
result.name = "木森"
print("装饰器扩张代码2")
return result
return wrapper
@decorator #Mytest = decorator(Mytest)
class Mytest:
a = 100
print("Mytest:",Mytest)
print()
print("asb",Mytest())

七:解决装饰器副作用--wraps函数
import time
from functools import wraps
def count_time(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
st = time.time()
# 调用原功能函数,并使用result接受返回值
result = fun(*args,**kwargs)
et = time.time()
print("函数执行时间:",fun.__name__)
# 装饰器中的代码执行完后,将原功能函数的结构返回出去
return result
return wrapper
@count_time
def work(a,b):
"""work函数"""
res = a+b
time.sleep(2)
return res
@count_time
def work2():
"""work2函数的文档注释"""
for i in range(3):
time.sleep(1)
@count_time
def work3(aa,bb,cc,d,e,f,r,y = 999):
"""work3函数的注释"""
print(aa,bb,cc,d,e,f,r,y)
# print(work(1,2))
# print(work2())
# 装饰器装饰之后会产生的副作用,无法获取原功能函数的特殊属性
print(work.__name__,work.__doc__)
print(work2.__name__,work2.__doc__)
print(work3.__name__,work3.__doc__)

八:装饰器传参
def decorator(name):
"""最外层的参数,接受装饰器传进来的值"""
def wrapper2(func):
"""第二层参数func,接收被装饰器的函数"""
def wrapper3(*args,**kwargs):
"""第三层参数,接受被装饰的函数,被调用时传进来的参数"""
print("装饰器扩展的功能代码1")
res = func(*args,**kwargs)
print("装饰器扩展的功能代码2")
return res
return wrapper3
return wrapper2
@decorator("musen")
def work():
return "66666666"
print(work())

网友评论