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

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

原文地址:https://www.cnblogs.com/materfont/p/9555526.html