zoukankan      html  css  js  c++  java
  • Python函数修饰符@的使用

    原文链接:

    python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志、性能测试、事务处理等等。

    创建函数修饰符的规则:
    (1)修饰符是一个函数
    (2)修饰符取被修饰函数为参数
    (3)修饰符返回一个新函数
    (4)修饰符维护被维护函数的签名

    例子1:被修饰函数不带参数

    复制代码
    def log(func):
        def wrapper():
            print('log开始 ...')
            func()
            print('log结束 ...')
        return wrapper
        
    @log
    def test():
        print('test ..')
    
    test()
    复制代码

    运行结果:

    log开始 ...
    test ..
    log结束 ...

    例子2:使用functools模块提供的修改函数属性的方法wraps

    复制代码
    def log(func):
        def wrapper():
            print('log开始 ...')
            func()
            print('log结束 ...')
        return wrapper
        
    @log
    def test1():
        print('test1 ..')
    
    def test2():
        print('test2 ..')
    
    print(test1.__name__)
    print(test2.__name__)
    复制代码

    运行结果:

    wrapper
    test2

    可见test1的函数名称变了,如果某些代码用到就会出问题,可以使用functools模块提供的修改函数属性的方法wraps

    复制代码
    from functools import wraps
    
    def log(func):
        @wraps(func)
        def wrapper():
            print('log开始 ...')
            func()
            print('log结束 ...')
        return wrapper
        
    @log
    def test1():
        print('test1 ..')
    
    def test2():
        print('test2 ..')
    
    print(test1.__name__)
    print(test2.__name__)
    复制代码

    运行结果:

    test1
    test2

    例子3:被修饰函数带参数

    复制代码
    from functools import wraps
    
    def log(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            print('log开始 ...',func.__name__)
            ret = func(*args,**kwargs)
            print('log结束 ...')
            return ret
        return wrapper
        
    @log
    def test1(s):
        print('test1 ..', s)
        return s
    
    @log
    def test2(s1, s2):
        print('test2 ..', s1, s2)
        return s1 + s2
    
    
    test1('a')
    test2('a','bc')
    复制代码

    运行结果:

    log开始 ... test1
    test1 .. a
    log结束 ...
    log开始 ... test2
    test2 .. a bc
    log结束 ...

    例子4:修饰符带参数,需要比上面例子多一层包装

    复制代码
    from functools import wraps
    
    def log(arg):    
        def _log(func):
            @wraps(func)
            def wrapper(*args,**kwargs):
                print('log开始 ...',func.__name__, arg)            
                ret = func(*args,**kwargs)
                print('log结束 ...')
                return ret
            return wrapper
        return _log
     
    @log('module1')
    def test1(s):
        print('test1 ..', s)
        return s
    
    @log('module1')
    def test2(s1, s2):
        print('test2 ..', s1, s2)
        return s1 + s2
    
    
    test1('a')
    test2('a','bc')
    复制代码

    运行结果:

    log开始 ... test1 module1
    test1 .. a
    log结束 ...
    log开始 ... test2 module1
    test2 .. a bc
    log结束 ...
  • 相关阅读:
    c++-面向对象:类和对象
    c++-内联函数和函数重载和默认参数和函数指针
    c++-引用
    c++-const
    c++--语言本身
    排序-基数排序
    排序-归并排序
    排序-堆排序
    常用Java API: ArrayList(Vector) 和 LinkedList
    常用Java API:Calendar日期类
  • 原文地址:https://www.cnblogs.com/yimai-series/p/13215393.html
Copyright © 2011-2022 走看看