python 装饰器简单释义
Tag
虽然我讲的不一定都是准确的,毕竟我也是个Python新手,具体的一些深入的原理还要靠大家自己去别的权威的地方了解。并且这里我也没有讲到namespace的东西。不过可以保证的是,看了这一篇文章,你一定能够有一个“装饰器”的思维。然后再通过你去查看其它关于装饰器的资料,这样才能真正弄懂它。这也是我这篇文章所能达到的高度,并不是要你看完就完全知道装饰器,而是能够有一个“装饰器”的思维,对查看其它资料有不小的帮助。
正文
装饰器本身就是一个函数,这里设为A,这个函数把另一个函数B作为它的参数,然后在装饰器这个函数A中将参数函数B进行修改,这样,函数B就被改变了。而“改变B”这件事本身就是装饰器的意义。(参考上边的Tag部分)
举个例子:(为了不使问题更加复杂,这里我直接用不规范的函数命名方式)
# 参数函数,就是要“被装饰”的函数
def B():
print("你的益达!")
# 装饰器,就是去“装饰”另一个函数的函数
def A(func):
def deco():
func()
print("再说一次-你的益达!")
return deco
# 下边是操作与对应结果
B() # TIME 1
B = A(B)
B() # TIME 2
-----------
# TIME 1中的结果:
你的益达!
# TIME 2中的结果 :
你的益达!
再说一次-你的益达!
可以看到,通过A的装饰,B与之前相比确实发生了变化。
然后我们把它改一下,让它更好玩,也更加便于记忆:(其实是展示装饰器的其它能力。。。)
def B(who):
print("%s的益达!" % who)
def A(func):
def deco(who):
who = "我"
print("哦对,是")
func(who)
return deco
# 下边是操作与对应结果
B("你") # TIME 1
B = A(B)
B("你") # TIME 2
-----------
# TIME 1中的结果:
你的益达!
# TIME 2中的结果 :
哦对,是
我的益达! # 参数“你”==> “我”
这一次,我们在被装饰函数B上加了参数,然后它就可以被装饰器A直接操作了,返回deco之后,发现B函数的参数也被改变了。
最后,python用@做语法糖来将我们上边的代码进行简化,具体是
# 两个函数跟上边的代码一样,只是在B的定义上边加了@A
def A(func):
def deco(who):
who = "我"
print("哦对,是")
func(who)
return deco
@A
def B(who):
print("%s的益达!" % who)
然后我们就可以把那一句B = A(B)去掉了,因为那个@A... 就是这一句的语法糖。它们是等价的。
也就是直接:B("你") 会输出:
哦对,是
我的益达!
总结
其实到了这里,大家就可以有一个我所谓的“装饰器的思维”了。就是让你在学习装饰器的过程中不会被其它各种东西扰乱了主要进程。然后就要靠大家自己去查找其它装饰器的资料来理解了。网上有很多,我就不介绍了。