zoukankan      html  css  js  c++  java
  • Python中的装饰器的初步理解

    什么是装饰器?

      装饰器的本质是一个函数,其作用是用来装饰其他的函数,给其他函数附加行的功能。

    原则:

       1.不能修改被装饰函数的源码。

      2.不能改变被装饰函数的调用方式。

    那么什么是函数?

     简单的来说:将一段代码逻辑,通过特殊的语法组织起来,可有参数,可有返回值,能够在

    别的地方被调用。python中函数是可以有参数也可以没有参数,可以有返回值,也可以没有。默认返回None.

    理解下面三句话:

      1.函数也是可以是变量

            函数也可以作为参数,函数也可以作为返回值

      2.高阶函数

           以函数作为参数,作者返回值是函数的函数

     3.函数嵌套

      函数里面定义函数

    装饰器 = 高阶函数 +   函数嵌套

    装饰器的应用场景:插入日志,性能测试,处理事物,权限验证等

    现在有一个需要,测试一个函数的运行时间

    #!/user/bin/env python3
    # -*- coding:utf-8 -*-
    
    import time
    
    
    def my_time(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            print("{}函数运行了{}秒".format(func.__name__, (end_time - start_time)))
            return ret
        return wrapper  # 注意不能是wrapp()
    
    
    @my_time  # 相当于f=my_time(f(x,y))
    def f(x, y):
        ret = x + y
        print("helle world")
        time.sleep(2)
        return ret
    
    
    print(f(3, 4))

     

    代参数的装饰器

    #!/user/bin/env python3
    # -*- coding:utf-8 -*-
    
    
    def logging(level):
        def wrapper(func):
            def inner_wrapper(*args, **kwargs):
                print("[{level}]: enter function {func}()".format(
                    level=level,
                    func=func.__name__))
                return func(*args, **kwargs)
            return inner_wrapper
        return wrapper
    
    
    @logging(level='INFO')
    def say(something):
        print("say {}!".format(something))
    
    # 如果没有使用@语法,等同于
    # say = logging(level='INFO')(say)
    
    
    if __name__ == '__main__':
        say('hello')
    

      下面是一个日志的装饰器

    def log(func):
        def wrapper(*args, **kwargs):
            print("begin call{}".format(func.__name__))
            temp = func(*args, **kwargs)
            print("after call %s" % func.__name__)
            return temp
        return wrapper
    

     刚刚开始入门,未在实际工厂环境中实际运用。后面还有类装饰器,内置的装饰器等,还有就是装饰器中的坑和优化,在实际过程中遇到再说,先入门。

  • 相关阅读:
    082、Java数组之数组传递之简化理解
    081、Java数组之数组传递
    080、Java数组之二维数组的定义及使用
    079、Java数组之数组的静态初始化
    078、Java数组之数组的引用传递
    077、Java数组之分步实现数组操作
    076、Java数组之定义数组
    075、Java面向对象之定义匿名对象
    074、Java面向对象之构造方法重载
    073、Java面向对象之利用构造方法为属性赋值
  • 原文地址:https://www.cnblogs.com/materfont/p/9555526.html
Copyright © 2011-2022 走看看