补充:
1、print(func._ _name_ _) 这样就会打印func本身的名字,只有一个func就会打印内存地址
2、不要用已知函数名或者方法名来命名变量
今天内容:
1、装饰器:本质就是闭包函数,功能就是在不改变原函数的功能和调用的前提下,对原函数进行扩展
2、装饰器基本结构:
def wrapper(func): #wrapper装饰器的名字 def inner(*args,**kwargs): #print('被装饰的函数执行之前你要做的事儿') print('你正在调用%s函数'%func.__name__) ret = func(*args,**kwargs) #被装饰的函数 #print('被装饰的函数执行之后你要做的事儿') return ret return inner @wrapper 要执行的函数名 = wrapper(要执行的函数名)
注意的点:
(1)使用者在调用函数时,实际上对于装饰器来说是调用的inner,所以函数和inner的参数要一样
(2)函数有返回值就在inner里赋值返回即可
(3)对于装饰器wrapper函数名来说,参数必须是inner里调用的函数名即func,因为语法糖的含义就是把wrapper(函数名)赋值给函数名
(4)@wrapper叫语法糖
3、开放封闭原则
(1)开放:对扩展是开放的
(2)封闭:对修改是封闭的,不能对已经改好的功能进行修改