python中的装饰器
为什么要用装饰器
因为装饰器可以在在不改变函数结构的情况加给函数添加新的功能
1.普通装饰器
def set_func(func):
def inner():
print("----1-----")
func()
return inner
@set_func # test = set_func(test)
def test():
print("这是被装饰的函数")
test()
"""输出结果"""
# ----1-----
# 这是被装饰的函数
"""代码分析"""
# 1.首先python程序从上到下运行
# 2.运行带装饰器@set_func的时候实际上执行的是test = set_func(test()),函数set_func(func)中的参数func指向test函数
# 3.最后执行test()函数,其实就是执行set_func(func)(),即执行inner(),然后就是执行func(),即执行test()
两个装饰器装饰一个函数
def add_qx(func):
print("---开始进行装饰权限1的功能---")
def inner(*args,**kwargs):
print("---这是权限验证1---")
return func(*args,**kwargs) + "++++"
return inner
def add_xx(func):
print("---开始进行装饰权限xx的功能---")
def inner(*args,**kwargs):
print("---这是权限验证xx---")
return func(*args,**kwargs) + "----"
return inner
"""输出结果"""
---开始进行装饰权限xx的功能---
---开始进行装饰权限1的功能---
---这是权限验证1---
---这是权限验证xx---
------test1------
haha----++++
# 多个装饰器装饰同一个函数,下边的装饰器先装饰
@add_qx # test = set_func(test)
@add_xx
def test1(*args,**kwargs):
print("------test1------")
return "haha"
print(test1())
"""流程"""
# python中程序是从上到向下顺序执行的,当碰到@add_qx装饰器的时候,因为装饰器装饰的是函数,而装饰器@add_qx
# 下边是@add_xx,不是个函数,所以程序继续向下执行,到@add_xx装饰器,下边是test1()函数,所以装饰器@add_xx
# 装饰器开始进行装饰,最后装饰成add_xx(test1())这样的一个函数,此时满足了装饰器@add_qx下边是函数的条件,
# 所以@add_qx开始进行装饰,只不过现在装饰的函数对象发生了改变,变成了add_xx(test1())函数