Python学习:装饰器

时间:2022-10-23 16:05:38

本节内容只有装饰器

装饰器的本质:

  1.一个闭包函数

  2.在不修改原函数及其调用方式的情况下对原函数功能进行扩展

 无参装饰器

Python学习:装饰器Python学习:装饰器
import time

def func1():
print('in func1')

def timer(func):
def inner():
start
= time.time()
func()
print(time.time() - start)
return inner

func1
= timer(func1)
func1()
一个计算代码引用时长的装饰器
Python学习:装饰器Python学习:装饰器
import time
def timer(func):
def inner():
start
= time.time()
func()
print(time.time() - start)
return inner

@timer
#==> func1 = timer(func1)
def func1():
print('in func1')


func1()
简单用法—语法糖

 有参装饰器

Python学习:装饰器Python学习:装饰器
def timer(func):
def inner(a):
start
= time.time()
func(a)
print(time.time() - start)
return inner

@timer
def func1(a):
print(a)

func1(
1)
有参数的装饰器
Python学习:装饰器Python学习:装饰器
import time
def timer(func):
def inner(*args,**kwargs):
start
= time.time()
re
= func(*args,**kwargs)
print(time.time() - start)
return re
return inner

@timer
#==> func1 = timer(func1)
def func1(a,b):
print('in func1')

@timer
#==> func2 = timer(func2)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over'

func1(
'aaaaaa','bbbbbb')
print(func2('aaaaaa'))
万金油装饰器
Python学习:装饰器Python学习:装饰器
import time
def timer(func):
def inner(*args,**kwargs):
start
= time.time()
re
= func(*args,**kwargs)
print(time.time() - start)
return re
return inner

@timer
#==> func2 = timer(func2)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over'

func2(
'aaaaaa','bbbbbb')
print(func2('aaaaaa'))
带返回值的装饰器

开放封闭原则:

  1.对扩展开放:在不改变原函数的前提下添加新功能,新拓展。

  2.对修改封闭:不修改原函数,因为可能原函数可能已经给别人用了,所以不能修改。

装饰器标准类型:

    

Python学习:装饰器Python学习:装饰器
def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re
= func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner
标准装饰器—背熟

带参数的装饰器:

  通过改变全局变量的来控制装饰器的开关。

Python学习:装饰器Python学习:装饰器
F=Flase
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re
= func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer

@outer(F)
def func():
print(111)

func()
带参数的装饰器

多个装饰器装饰同一个函数:

  给同一个函数装多个装饰器,顺序从最贴近原函数的装饰器,层层往上装饰。

 

Python学习:装饰器Python学习:装饰器
def wrapper1(func):
def inner():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner

def wrapper2(func):
def inner():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner

@wrapper2
@wrapper1
def f():
print('in f')

f()
多个装饰器装饰

总结:

  略