day 12 python的装饰器

1·装饰器

①装饰器的作用:在不改变函数的基础上,在函数的前后添加新的功能

②使用原则:开放封闭原则(开放:对扩展时开放的;封闭:对修改是封闭的)

2·语法糖:@装饰函数

3·本节涉及的库:time   (import time)

print(time.tim())#获取当前时间

print(time.sleep(时间间隔))  #让程序在执行到这里的时候停一会儿s

装饰器的固定模式:

例:

import time

def timmer(f):     #装饰器函数  ,f为被装饰函数

  def inner( ):

    start = time.time()

    ret = f( )

    end = time.time()

    return ret

  return inner

@timmer    #语法糖,装饰器函数的调用方法   func= timmer(func)-->inner

def func():    #被装饰函数

  time.sleep(0.1)

  print('博主真帅!')

  return '无与伦比' 

带有参数的装饰器函数:

import time

def timmer(f):     #装饰器函数

  def inner(*args,**kwargs):

    start = time.time()

    ret = f(*args,**kwargs)

    end = time.time()

    return ret

  return inner

@timmer    #语法糖,装饰器函数的调用方法   func= timmer(func)-->inner

def func(a,b):    #被装饰函数

  time.sleep(0.1)

  print('博主真帅!')

  return '无与伦比' 

需要理解装饰函数的在程序中的执行顺序:

装饰器的进阶:(函数的停止调用,及三层函数)

当存在多个参数时,500个函数的时候,如何停止函数的调用

import time

flage = True

def wrapper(flage):

 def timmer(f):

  def inner(*args,**kwargs):

   if flage:

    start =time.time()

    ret  = f(*args,**kwargs)

    end = time.time()

    print(end-start)

    return ret

   else:

    ret = f(*args,**kwargs)

    print(‘函数在这里:’)

  return inner

 return timmer 

@wrapper(flage)     #相当于wrapper(flage) = timmer,先执行wrapper(),再调用函数timmer

def func(a.c):
  rtime.sleep(0.3)

  print('11')

func(1,2)

多个函数装十一个函数:

def wrapper1(f):#f =func

  def inner1():

    print('wrapper1 after om func')

    ret = f()

    print('wrapper1 after om func')

    return inner1

def wrapper2(f): #f=inner1

  def inner2():

    print('wrapper2 after om func')

    ret = f()

    print('wrapper2 after om func')

    return inner2

def wrapper3(f): #f =inenr2

  def inner3():

    print('wrapper3 after om func')

    ret = f()

    print('wrapper3 after om func')

    return inner3

@wrapper3  #func =wrapper3(func)=wrappr3(func) = inner3

@wrapper2 #func =wrapper2(func)= wrapper2(inner1) = inner2

@wrapper1 #func = wrapper1(func)-->inner1

#三个装饰器的使用顺序,先执行最接近被装饰的那个装饰器

def func():
  print('niubi')

func()  #-->inner3()-->inner2()-->inner1()

#应用:

可应用于记录用户的来访情况

计算这个函数的执行时间

posted @ 2019-09-08 23:51  pickGo  阅读(89)  评论(0编辑  收藏  举报