装饰器example
Python Decorators in 15 Minutes
- 什么是装饰器?
- python装饰器用于装饰函数。可以在保留原函数功能的条件下,赋予该函数更丰富的功能(而无需改动原函数)
- 为什么要用装饰器?
- 可以更便于开发,实现代码复用
- 装饰器可以解决哪些问题?
- 不破坏原函数的条件下,扩展函数功能(或函数权限)
小明每学会一个新本领,他妈妈都会说:“小明太棒了”。所以把妈妈说的话单独写个函数,以后在每次调用时,就可以代码复用
momSaid(func)
里的参数为函数def wrapper(*args,**kwargs)
…return wrapper
可以自动调用函数参数。(如learnAdd
函数有3个参数,learnSubtraction
有两个,但是完全没问题)
def momSaid(func):
def wrapper(*args,**kwargs):
f=func(*args,**kwargs)
print("算数结果为{}".format(f))
print("妈妈说小明太棒了")
return f
return wrapper
@momSaid
def learnAdd(a,b,c):
print("小明学会了加法")
res=a+b+c
return res
@momSaid
def learnSubtraction(a,b):
print("小明学会了减法")
res=a-b
return res
learnAdd(3,2,1)
print("===")
learnSubtraction(2,1)
运行结果为:
小明学会了加法
算数结果为6
妈妈说小明太棒了
===
小明学会了减法
算数结果为1
妈妈说小明太棒了
小明和他爸爸都喜欢看动画片。于是小明的妈妈在电视上加了年龄权限,当爸爸在看天线宝宝时,会提醒他别看啦(增加函数权限)。而小明在看时,就不会提醒(不破坏原函数)
def accessTV(func):
def wapper(*args,**kwargs):
if age<=18:
return func(*args,**kwargs)
print("小明的爸爸,你都成年啦,别看天线宝宝啦")
return wapper
@accessTV
def watchTV():
print("小明在看天线宝宝")
age=10
watchTV()
运行结果为:
age小于等于18时,函数输出:小明在看天线宝宝
age大于18时,函数输出:小明的爸爸,你都成年啦,别看天线宝宝啦
chain decorator
有多个装饰器时,先包裹里面的
def set_fun1(func):
print("set_fun1") # 打印用于验证在多个装饰器的情况下,多个装饰器之间的执行顺序
def call_fun1(*args, **kwargs):
print("call_fun1") # 当被装饰函数执行时,会打印
func()
return call_fun1
def set_fun2(func):
print("set_fun2")
def call_fun2(*args, **kwargs):
print("call_fun2")
func()
return call_fun2
# 装饰函数
@set_fun1
@set_fun2
def test():
print("hello world")
test()
# set_fun2 # set时相反
# set_fun1 # set时相反
# call_fun1 # 再被1包裹
# call_fun2 # 先被2包裹
# hello world