Python中装饰器的那些事儿…
说到装饰器,我们需要首先理解下闭包的概念,走起!
定义:具有执行环境的函数
满足三个条件:
1.外部函数中定义一个内部函数
2.内部函数中使用外部函数的局部变量
3.外部函数将内部函数作为返回值返回
此时的内部函数就叫闭包
怎么缩呢?来看个例子吧!(滑稽)
#先定义一个外部函数
def wai(n):
#在外部函数中定义一个内部函数
def nei():
# 内部函数中使用外部函数的局部变量
return n * n
#内部函数作为返回值
return nei
#对函数进行调用
f1 = wai(10)
f2 = nei(4)
print(f1())
print(f2())
打印结果为:
下面进入正题:装饰器
装饰器
-
作用:当需要改变一个函数原有的功能时,但是不想/不能改变原来的函数,可以通过装饰器解决
-
使用:
- 装饰器其实就是一个函数,该函数有一个参数(函数类型),返回一个闭包
- 在返回的闭包中调用传递进来的函数,然后在调用函数的前后就可以添加内容
-
示例:
#定义一个装饰器(参数为一个函数) def zhuangshiqi(func): def wrapper(): print('开始装饰') func() print('装饰结束') return wrapper @zhuangshiqi # 相当于执行了:test = zhuangshiqi(test) def test(): print('for test') # t2 = zhuangshiqi(test) # t2() # test = zhuangshiqi(test) test()
执行结果为:
Python中的装饰器的分类:
def cool(func):
def wrapper():
print('Vans卫衣')
func()
print('Air Jordan')
return wrapper
@cool
#屌丝变高富帅
def diaosi():
print("屌丝大变身?")
diaosi()
装饰带参无返回值的函数
def zhuangshiqi(func):
def wrapper(*args, **kwargs):
print('开始装饰')
func(*args, **kwargs)
print('装饰结束')
return wrapper
@zhuangshiqi
def test(n):
print('I like num {}'.format(n))
test(250)
装饰有参有返回值的函数
def zhuangshiqi(func):
def wrapper(*args, **kwargs):
print('开始装饰')
ret = func(*args, **kwargs)
print(ret)
print('装饰结束')
return ret
return wrapper
@zhuangshiqi
def add(a, b):
return a + b
print(add(3, 5))
关于Python中装饰器的讲解就讲到这里,希望能帮助到大家!
如果觉的还可以的话点个赞再走吧…