装饰器之闭包
"""
闭包是学习装饰器前必学的一项,学习闭包 装饰器 有助于以后在代码开发的便捷 重用 解耦和性
相关地址:https://www.cnblogs.com/s-1314-521/p/9763376.html
闭包的定义:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,
如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
"""
def sys_outer(num_outer):
print("这是外部函数,传入的是[{}]".format(num_outer))
def sys_inner(num_inner):
print("这里是内部函数,传入的是[{}]".format(num_inner))
num_result = num_outer + num_inner
print("内部函数运算结果[{}]".format(num_result))
return sys_inner
if __name__ == '__main__':
temp1 = sys_outer(10)
temp1(5)
temp1(1)
temp1(10)
print("==" * 50)
temp2 = sys_outer(5)
temp2(1)
temp2(3)
temp2(-3)
创建简单装饰器(权限验证)
def set_func(func):
def all_func():
print("权限验证1")
print("权限验证2")
print("权限验证通过")
func()
return all_func
@set_func
def get_info():
print("获取xxxx数据")
if __name__ == '__main__':
get_info()
对不定长度参数的函数进行装饰
def set_func(func):
def run_func(*args, **kwargs):
print("权限验证1")
print("权限验证2")
"""
在调用实际函数的时候 传入的参数如果不加星号 就是单纯当成参数传输
如 果加上星号 python 会自动对这些参数进行拆分 传入的是哪种形式格式 调用函数的时候就是哪种的形式格式
"""
return func(*args, **kwargs)
return run_func
@set_func
def test1(name, *args, **kwargs):
print("test1[{}]".format(name))
print("test[{}]".format(args))
print("test[{}]".format(kwargs))
test1(100)
print("==" * 50)
test1(100, 200, 300)
print("==" * 50)
"""
这里有个坑 这里有个坑 这里有个坑 ,不要json key 为name python 中把name 当成了关键字 要报错 要报错
"""
test1(100, 200, 300, name1="张三", age=13)
多个装饰器对同一个函数进行装饰
"""
测试多个装饰器对同一个函数进行的装饰
"""
def add_aaa(func):
print("触发装饰器1")
def call_func(*args, **kwargs):
print("这是权限验证1")
return func(*args, **kwargs)
return call_func
def add_bbb(func):
print("触发装饰器2")
def call_func(*args, **kwargs):
print("这是权限验证2")
return func(*args, **kwargs)
return call_func
@add_aaa
@add_bbb
def test1():
print("正常逻辑test1")
test1()
用类对函数进行装饰
class Test(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("这是类装饰器")
return self.func(*args, **kwargs)
@Test
def run_test1(mm):
print("执行方法逻辑[{}]".format(mm))
run_test1("张三")