Python-装饰器的创建与使用

装饰器之闭包
"""

闭包是学习装饰器前必学的一项,学习闭包 装饰器 有助于以后在代码开发的便捷 重用 解耦和性

相关地址: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):
    # test1(100,200,300,name="张三",age=13)  折算成  args=(100,(200,300)) kwargs={"name":"张三","age"=13}
    def run_func(*args, **kwargs):
        print("权限验证1")
        print("权限验证2")
        """
        在调用实际函数的时候 传入的参数如果不加星号 就是单纯当成参数传输
        如 果加上星号 python 会自动对这些参数进行拆分 传入的是哪种形式格式 调用函数的时候就是哪种的形式格式
        """
        # func(args, kwargs)    这样相当于传递了两个参数 一个元组,一个字典(json)
        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)

多个装饰器对同一个函数进行装饰
"""
测试多个装饰器对同一个函数进行的装饰
"""


# 装饰器1
def add_aaa(func):
    print("触发装饰器1")

    def call_func(*args, **kwargs):
        print("这是权限验证1")
        return func(*args, **kwargs)

    return call_func


# 装饰器2
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("张三")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值