• Python装饰器和调用函数,带括号非括号的区别


    1、装饰器带括号非括号

    #不带参数的装饰器
    def log4(func):
        @wraps(func)
        def inner(*args, **kwargs,):
            func(*args, **kwargs)
        return inner
    @log4
    def test(num):
        print('testlog4:',num,test.__name__)
    test(40)
    
    
    #带参数的装饰器
    def log5(level):
        def log(func):
            @wraps(func)
            def inner(*args, **kwargs,):
                if level == "warn":
                    print("%s is running" % func.__name__)
                func(*args, **kwargs)
            return inner
        return log
    @log5(level="warn")
    def test(num):
        print('testlog5:', num, test.__name__)
    test(50)

    不带参数的装饰器:带括号、不带括号的区别

    #不带参数的装饰器:带括号、不带括号
    from functools import wraps
    import time
    
    def runTime(func):
        @wraps(func)
        def inner(*args, **kwargs):
            s = time.time()
            func(*args, **kwargs)
            print(f'--> {func.__name__} RUN TIME: <{(time.time() - s)}> ')
        return inner
    
    
    """
    @runTime   等同于 @runTime        => test1 = runTime(test1)
    @runTime() 等同于 @inner 非装饰器  => test2 = runTime()(test2)  = inner(test2)  报错
    """
    
    @runTime
    def test1():
        pass
    @runTime()
    def test2():
        pass

    带参数的装饰器:带括号、不带括号的区别

    #带参数的装饰器:带括号、不带括号
    from functools import wraps
    import time
    
    def out_runTime(name='测试'):
        def runTime(func):
            @wraps(func)
            def inner(*args, **kwargs):
                s = time.time()
                func(*args, **kwargs)
                print(f'--> {func.__name__} RUN TIME: <{(time.time() - s)}> ')
            return inner
        return runTime
    
    
    """
    @out_runTime   等同于 @out_runTime         => test1 = out_runTime(test1)  报错
    @out_runTime() 等同于 @runTime 返回一个装饰器 => test2 = runTime(test2)
    """
    
    @out_runTime
    def test1():
        pass
    
    @out_runTime()
    def test2():
        pass

    2、调用函数带括号非括号

    """
    1、不带括号时,调用的是这个函数本身,是整个函数体,是一个函数对象
    2、带括号(参数或者无参),调用的是函数的执行结果
    """
    def a():
          return 1
    print(a)
    print(a())
  • 相关阅读:
    Mysql Select 语句中实现的判断
    SQL根据一个字符串集合循环保存数据库
    SQL语句 不足位数补0
    SVN常见错误
    svn架构
    关于EXCEL显示数字
    exception from hresult:0x8000401A(excel文档导出)
    WIN7安装注意事项
    解决卸载时残留目标文件夹的问题
    Installshield执行多条批处理的方法
  • 原文地址:https://www.cnblogs.com/shuzf/p/15947132.html
Copyright © 2020-2023  润新知