python装饰器的理解(整理笔记4)

python装饰器

理解:不修改原函数代码的情况下,增强该函数的功能

原理:基于闭包,接收一个函数为参数返回另一个函数的函数

标准库中存在的装饰器:

  1. python内置了三个用来装饰方法的函数property、classmethod、staticmethod
  2. functools模块中常见的装饰器:functools.wraps,可以协助创建良好的装饰器函数
  3. lru_cache和singledispatch,这两个装饰器都在functools模块中

自己写的装饰器使用方法

一、写法1
①这里写了use_logging来作为装饰器,接收func函数作为参数,功能实现在内部函数wrapper
②将foo函数作为参数传递给use_logging
③foo()相当于执行wrapper()+foo()的结果

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
foo()                   # 执行foo()就相当于执行 wrapper()

二、写法2
①这里写了use_logging来作为装饰器,接收func函数作为参数,功能实现在内部函数wrapper
②@符号是装饰器的语法糖,他放在foo函数开始定义的地方直接实现wrapper()+foo()的赋值操作
③执行foo()就相当于执行wrapper()+foo()的结果

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()
    return wrapper

@use_logging
def foo():
    print("i am foo")

foo()

三、为带有参数的函数定制带有参数的装饰器
只需在最内部实现的wrapper写上参数*args, **kwargs

def wrapper(*args, **kwargs):
        # args是一个数组,kwargs一个字典
        logging.warn("%s is running" % func.__name__)
        return func(*args, **kwargs)
    return wrapper

你可能感兴趣的:(python,学习)