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结束 ...
  • 相关阅读:
    混合使用UITabBarController和UINavigationController
    基本组件的使用——UITabBarController
    基本组件的使用——UINavigationController
    ios应用程序结构
    让我想起了以前
    如何利用新浪博客做外链1
    如何利用新浪博客做外链
    网站优化之如何更新发布文章
    无线淘宝有600多项加权项
    用代理服务器直接注册小号刷单
  • 原文地址:https://www.cnblogs.com/gdjlc/p/11182441.html
Copyright © 2011-2022 走看看