装饰器
1.装饰器的特点:
1.函数要作为参数
2.要有闭包的特点
2.装饰器的作用:
主要还是提高代码复用,在不改变原函数的情况下,对函数功能进行修改
3.举例一个简单的装饰器的例子
# 定义了一个装饰器
def decorate(func): # 这里传进来的是一个函数
def wrapper():
func()
print('铺地板')
return wrapper
@decorate # @装饰器函数 这个是必须写的
def house(): # 被装饰器修饰的函数
print('毛坯房:')
house()
'''
@装饰器函数 之后,会执行以下步骤:
1.将被装饰函数作为参数传递给装饰器
2.然后会执行装饰器函数(会加载内部函数,因为还没有调用,所以只是加载)
3.将装饰器的内部函数的地址返回给被装饰的函数名(也就是将wrapper函数的地址给了house)
4.被装饰的函数进行调用(house()进行调用)
'''
4.原函数带有参数
# 不可变参数
def decrator(func): # 装饰器
def inner_func(x): # 包装,装饰
func(x) # 调用被装饰函数
print('装饰{}它为:包子'.format(x))
return inner_func
@decrator
def func(x):
print('装饰{}为:饺子'.format(x))
func('小谢')
'''
执行结果为:
装饰小谢为:饺子
装饰小谢它为:包子
'''
#可变参数 ----》 万能参数,在以后写代码时,就这么用
def decrator(func): # 装饰器
def inner_func(*args, **kwargs): # 包装,装饰
func(*args, **kwargs) # 调用被装饰函数
# ....
return inner_func
@decrator
def func(*args, **kwargs):
# ...
pass
# 两层装饰器
def decrator1(func1): # func1 = pri_func
print('第一个装饰器')
def inner_func():
func1()
print('第一个装饰器完毕')
return inner_func
def decrator2(func2): # func2 = func1
print('第二个装饰器')
def inner_func():
func2()
print('第二个装饰器完毕')
return inner_func
@decrator2
@decrator1
def pri_func(): # 函数离哪个装饰器近,先装饰哪个
print('开始装饰!')
pri_func()
'''
执行结果为:
第一个装饰器
第二个装饰器
开始装饰!
第一个装饰器完毕
第二个装饰器完毕
'''
5.装饰器带有参数
def decrator_outer(a): # 接收 装饰器 参数
# 原 装饰器
def decrator(func): # 接收 函数
def wrapper(*args, **kwargs): # 接收 函数参数
func(*args, **kwargs)
print(a)# 调用被装饰函数,保持其原功能
return wrapper
# 返回原 装饰器
return decrator
@decrator_outer(3)
def pri_func():
pass
要叠加成三层。