装饰器,作用: 功能注入。
def a():
print("这是一个初始功能")
#output
#这是一个初始功能
为方法添加一个功能
def a():
print("这是一个初始功能")
print("这是一个增加功能")
#output
#这是一个初始功能
#这是一个增加功能
这种方式很low,一旦需要增加功能的方法多了,特别繁琐,这时候python提供了一个装饰器的功能,来试一下
下面在不改变原有函数体(a())的情况下,使用装饰器的实例。
def b(a):
def c():
a()
print("这是一个增加功能")
return c
@b
def a():
print("这是一个初始功能")
a()
#output
#这是一个初始功能
#这是一个增加功能
如果原有函数有参数,怎么使用装饰器,下面举个例子。
def b(a):
def c(x,y):
a(x,y)
print("两数相减的结果是",x-y)
return c
@b
def a(x,y):
print("两数相加的结果是",x+y)
a(8,6)
#output
#两数相加的结果是 14
#两数相减的结果是 2
如果原有函数参数不定,使用装饰器,举个例子。
def b(a):
def c(x,y,*z):
a(x,y,*z)
z = z[0]
print("三数相减的结果是",x-y-z)
return c
@b
def a(x,y,*z):
print("两数相加的结果是",x+y)
a(8,6,1)
#output
#两数相加的结果是 14
#三数相减的结果是 1
原有函数体参数固定,同样可以加参,下面是示例。
def b(a):
def c(x,y,*z):
a(x,y)
z = z[0]
print("三数相减的结果是",x-y-z)
return c
@b
def a(x,y):
print("两数相加的结果是",x+y)
a(9,4,2)
#output
#两数相加的结果是 13
#三数相减的结果是 3
多装饰器,输出排序总结。
def b(a):
print("bbb")
def d():
print("ddd1")
a()
print("ddd2")
return d
def c(a):
print("ccc")
def e():
print("eee1")
a()
print("eee2")
return e
@b
@c
def a():
print("aaa")
a()
#output
'''
ccc
bbb
ddd1
eee1
aaa
eee2
ddd2
'''
规律总结:
先输出装饰器主体函数的语句,按照就近原则(距离原函数体越近),先输出;
再按照就远原则,输出装饰器内回调函数,原函数实例化之前的函数体部分;
再输出原函数部分(但有且仅输出一次);
最后又回到就近原则,输出装饰器内回调函数,原函数实例化之后的函数体部分。
#author:HylerV
#data:2019/05/21