版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lijinshanba/article/details/83182685
之前写代码遇到一个函数的上一行有格式为
@函数名
因此做了一些学习,这玩意叫装饰器,它用来装饰一个函数,装饰器fun1(),参数必须是函数名,返回值也必须是一个函数!!!
在Python中允许函数名作为另一个函数的参数,即fun1(fun2),注意不能写成fun1(fun2())。
从下面的例子当中可以看到,fun2()和fun3()两个函数体内容差不多,一个用了装饰器,一个用了函数嵌套调用,结果也类似。
其中代码段
@fun1
def fun2():
print("function2")
相当于 fun1(fun2) 函数嵌套调用,
或者说,相当于 fun2 = fun1(fun2),还记得刚刚说过的吧,fun1()返回值是一个函数,所以fun1(fun2)的结果赋值给fun2,fun2依旧是一个函数,只是此时已经被装饰过了。
扫描二维码关注公众号,回复:
4701139 查看本文章
def fun1(funname): #这个funname是一个函数的名字,函数名字作为另一个函数的参数
print("initial function")
return funname() #也可以不用写返回值,直接funname()也行
@fun1 # 相当于 fun1(fun2) 函数嵌套调用
def fun2():
print("function2")
def fun3():
print("function3")
print("分割线---------------")
fun1(fun3) #不能写成fun1(fun3())
结果:
initial function
function2
分割线---------------
initial function
function3
注:return funname() 不要写成 return funname !!!要加括号
下面说一下 类装饰器
下面内容转载自:https://mp.weixin.qq.com/s/98JA68TX9X4j6wPABiMJNA
请移步原文
class myDecorator(object):
def __init__(self, func):
print "inside myDecorator.__init__()"
self.func = func
def __call__(self):
self.func()
print "inside myDecorator.__call__()"
@myDecorator
def aFunction():
print "inside aFunction()"
print "Finished decorating aFunction()"
aFunction()
# output:
# inside myDecorator.__init__()
# Finished decorating aFunction()
# inside aFunction()
# inside myDecorator.__call__()
我们可以看到这个类中有两个成员:
-
一个是__init__(),这个方法是在我们给某个函数decorator时被调用,所以,需要有一个func的参数,也就是被decorator的函数。
-
一个是__call__(),这个方法是在我们调用被decorator函数时被调用的