装饰器
#对于不可变的数据类型 如果在函数内部修改想对全局生效,就要进行global声明
a = 10 def func(): global a a = 20 print(a) func() print(a)
#对于可变的数据类型 如果在内部想要修改,直接修改即可
a = {'k':'v'}
def func():
#a['k'] = 'vvvvvv'
a = {'k':'vvvvvv'}
print(a)
func()
print(a)
装饰器的固定格式
def wrapper(func): #wrapper装饰器的名字 def inner(*args,**kwargs): #print('被装饰的函数执行之前你要做的事儿') print('你正在调用%s函数'%func.__name__) ret = func(*args,**kwargs) #被装饰的函数 #print('被装饰的函数执行之后你要做的事儿') return ret return inner
开放封闭原则
#开放 对扩展是开放的
#封闭 对修改是封闭的
添加一个函数运行计时功能
import time def timmer(func): #装饰器 def inner(*args,**kwargs): start = time.time() ret = func(*args,**kwargs) #qqxing(a) end = time.time() print(end - start) return ret return inner @timmer #qqxing = timmer(qqxing) #语法糖 def qqxing(num,num2): #被装饰的函数 for i in range(10000000):pass print('老板万岁') return num+num2 #对于用户来讲 你感知不到装饰器的存在 在一个函数的前后添加功能 ret = qqxing(1,2) #inner(1) print(ret) #123
带参数的装饰器:
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(False) def func(): print(111) func()
多个装饰器装饰一个函数
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()

浙公网安备 33010602011771号