不可不知道的python装饰器

前记

  python小白,估计很多没用过这个高级功能吧,当你用了它之后就会发现,真是非常好用喔。
  装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

概念实例

  • 简单装饰器
      简单装饰器一般有两种写法,一种是直接定义函数,另外一种是使用@这个装饰器的语法糖来操作,下面以一个例子做结束:
import logging

def use_logging(func):

    def wrapper():
        logging.warning("%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()

@use_logging
def apple():
    print("I am apple")


apple()
  • 带参数的装饰器
      装饰器灵活性非常的高,它可以允许自带参数,这里就是一个自带参数的装饰器例子:
import logging

def use_logging(level):

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


@use_logging(level="warn")
def apple(name='apple'):
    print("I am %s "%name)


apple("apple")
  • 类装饰器

  相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。下面看一个例子;

class cat(object):
    def __init__(self,func):
        self._func = func

    def __call__(self):
        print("class decorator running")
        self._func()
        print("class decorator ending")


@cat
def bar():
    print("bar is running")

bar()

猜你喜欢

转载自www.cnblogs.com/dylancao/p/12410368.html