装饰器笔记

装饰器的作用:

  在不改变原函数的基础上,添加其他功能

## 固定模式:

def wrapper(func):

  def inner(*args, **kwargs):

    '''执行被装饰的函数前做的事'''

    ret = func(*args, **kwargs)

    '''执行被装饰的函数后做的事'''

    return ret

  return inner

@wrapper

def func(a):

  print('Hello!',a)

  return '欢迎'

  

ret = func(‘梵谷’)

print(ret)

## 带一个参数的装饰器:

import time

flag = False

def wrapper_out(flag):

  def wrapper(func):

    def inner(*args, **kwargs):

      if flag:

        star = time.time()

        ret = func(*args, **kwargs)

        end = time.time()

        print(end - star)

        return ret

      else:

        ret = func(*args, **kwargs)

        return ret

    return inner

  return wrapper

  

@wrapper_out(flag)

def fancoo():

  time.sleep(0.1) 

  print('你好!')

@wrapper_out(flag)

def famcoo():

  time.sleep(0.2)

  print('再见!')

  

fancoo()

famcoo()

## 多个装饰器装饰一个函数

def wrapper1(func):
  def inner1():
    print('wrapper1 ,before func')
    ret = func()
    print('wrapper1 ,after func')
    return ret
  return inner1

def wrapper2(func):
  def inner2():
    print('wrapper2 ,before func')
    ret = func()
    print('wrapper2 ,after func')
    return ret
  return inner2

def wrapper3(func):
  def inner3():
    print('wrapper3 ,before func')
    ret = func()
    print('wrapper3 ,after func')
    return ret
  return inner3

@wrapper3
@wrapper2
@wrapper1
def f():
  print('in f')
  return '哈哈哈'

print(f())

结果是:3,2,1,f(),1,2,3

  

## 番外

from functools import wraps
def wrapper(func):    #func = holiday
  @wraps(func)
  def inner(*args,**kwargs):
    print('在被装饰的函数执行之前做的事')
    ret = func(*args,**kwargs)
    print('在被装饰的函数执行之后做的事')
    return ret
  return inner

@wrapper    #holiday = wrapper(holiday)
def holiday(day):
  '''这是一个放假通知'''
  print('全体放假%s天'%day)
  return '好开心'

print(holiday.__name__)
print(holiday.__doc__)
  

ret = holiday(3) #inner
print(ret)

猜你喜欢

转载自www.cnblogs.com/famcoo/p/9504002.html