zoukankan      html  css  js  c++  java
  • python装饰器

    1 写装饰器的框架

    # 写函数装饰器的框架
    # 传入被装饰函数,
    def func1(func):
        def func2():
            # 执行装饰功能后,返回函数
            # 而这里返回函数的用法就体现了闭包的思想,参数func对于func2是外部函数的变量,
            return func
        # 返回装饰函数
        return func2
    
    # 不影响原有函数的功能,还能添加新的功能,结果就是
    # func() = func2() + func()
    # 使用语法糖,这里的@func1 相当于 func = func1(func)
    # func1必须要定义在func函数之前才可以被装载!这一点很重要!
    @func1
    def func():
        return
    func()
    View Code

    2 闭包的概念

    # 闭包
    # 简单来说就是一个函数定义中引用了函数外定义的变量,
    # 并且该函数可以在其定义环境外被执行。这样的一个函数我们称之为闭包
    def func():       # 外部函数
        a = 1         # 外部函数作用域里的变量
        print('this is func')
        def func1(num):
            print('this is func1')
            print(num + a)
        return func1
    # # NameError: name 'func1' is not defined,
    # # 因为func()函数调用结束的时候,里面的变量会被销毁,
    # func()
    # func1()
    # 为了在func()函数外部也可以调用func1(),所以把func1()作为返回值
    # 这时发现不仅可以调用func1(),而且可以调用外部函数作用域里的变量,
    # 这时因为返回fun1的时候连那些变量一起返回了,这时的函数已经不是原先的那个函数了,
    # 是带有外部函数作用域里的变量的函数,也就闭包内的闭包函数私有化了变量,这样的函数称为闭包函数
    f1 = func()
    f1(3)
    View Code

    3 装饰器的实现

    def arg_func(sex):
        def func1(b_func):
            def func2():
                if sex == 'man':
                    print('你不可以生娃')
                elif sex == 'woman':
                    print('你可以生娃')
                return b_func()
            return func2
        return func1
    # arg_func(sex='man')()() > func1
    # func1() > func2
    # func2() > print('你不可以生娃') or print('你可以生娃')
    @arg_func(sex='man') # 注意语法糖的用法,@arg_func(sex='man') 等价于 arg_func(sex='man')(man)
    def man():
        print('好好上班')
    
    @arg_func(sex='woman')
    def woman():
        print('好好上班')
    man()
    woman()
    View Code

    ttt

    def logger(fn):
        def wrapper(*args, **kwargs):
            print('函数被执行了')
            res = fn(*args, **kwargs)
            print('函数执行完毕')
            return res
        return wrapper
    
    @logger   # 等于 add = logger(add) 一定要注意这里
    def add(x, y):
        return x + y
    add(4,5)
    View Code

    参考:https://blog.csdn.net/beyondlee2011/article/details/86556327#3__234

    https://blog.csdn.net/xiangxianghehe/article/details/77170585?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

    https://www.cnblogs.com/zhangzhuozheng/p/8053045.html

  • 相关阅读:
    Hive优化(转)
    hive--UDF、UDAF
    Java学习-Overload和Override的区别
    Java学习-集合(转)
    Hbase实例
    Java学习-数组
    Hadoop中两表JOIN的处理方法(转)
    Hive优化(转)
    Java学习--final与static
    Java学习--String、StringBuffer与StringBuilder
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12702283.html
Copyright © 2011-2022 走看看