今天详细的研究了一下装饰器,怎么说呢,这个语言这种东西真的是要不断去消化和理解的,单纯的依靠外来的资源是比较难去学明白的,如果你还不明白装饰器那么不妨往下读一读,当你明白了装饰器之后,我们都会发现这个东西不是我们想象的那么难的一件事,但是我们如果想给一个完全没了解的人讲明白他的原理以及一些操作的时候就会发现有的东西,只可意会而不能去言传。哈哈哈,我这个人废话好多。
那么,开始了!
简单介绍一下装饰器的原理,以及装饰器的作用。在进行一些软件的开发时,牛逼的项目经理不免会在这个产品成型之后或者说是这个产品做到了一半的时候临时告诉你我们需要在这个功能上新加一个功能。那么,如果我们开始修改源代码,有可能因为一个字符转换或者一个变量而出现一大堆问题,更甚至导致整个系统崩溃。所以我们需要使用我们的装饰器来避免这一问题,那么装饰器是如何做到的呢。小兄弟,这个问题问的好。装饰器本质上就是一个函数,确切的说是一个可以对其他函数进行功能添加的函数,在规则上装饰器不能修改函数的源代码和调用方式。那么满足上一句话的函数我们就叫他装饰器,或者说是装饰函数(花里花哨的东西总有一个土到掉渣的名字)。
那么了解了装饰器的定义之后,我们开始煮栗子
1 defbest(func):2 def ok_1(*regs):3 print ("老实说")4 func(*regs)5 returnok_16
7 @best #text_1 = best(text_1)
8 deftext_1():9 print ("我是最棒的")10
11 @best12 deftext_2(name):13 print ("我喜欢你",name)14
15 text_1()16 text_2("白菜")
这就是一个简单的但是全面的栗子
我们一步一步来把它实现出来
我们第一步功能是执行text_1(),text_2()之后,分别打印我是最棒的和我喜欢你
代码如下
deftext_1():print("我是最棒的")deftext_2():print("我喜欢你")
text_1()
text_2()
添加功能在打印两句话之前,再打印“老实说”,并且不能改变两个函数的源代码,
那么如何实现呢,我们可以再定义一个函数用来打印“老实说”这三个字,之后在这个函数里面调用我们的text_1()和text_2()这两个函数,然后我们可以在最后调用这个函数就可以了
代码如下
1 deflaoshishuo(func):2 print("老实说")3 func()4
5 deftext_1():6 print("我是最棒的")7
8 deftext_2():9 print("我喜欢你")10
11 laoshishuo(text_1)12 laoshishuo(text_2)
下一步我们思索
不能改变调用的函数名字,(因为我们最后实现功能是靠调用了laoshishuo(text_1)和laoshishuo(text_2)这两个函数来实现)
最后实现功能的时候依旧要调用我们的
1 text_1()2 text_2()
这两行代码来实现功能
就是一个符合定义的装饰器啦,在这里我们使用嵌套函数
代码如下
高阶+嵌套=修饰器
当然了,伟大的前辈发现这两行代码只要是需要修饰器就得写一次,于是
defqiantao(func):deflaoshishuo():print("老实说")
func()returnlaoshishuo
@qiantao#text_1 = qiantao(text_1)
deftext_1():print("我是最棒的")
@qiantao#text_2 = qiantao(text_2)
deftext_2():print("我喜欢你")
text_1()
text_2()
这个@qiantao 学名叫做语法糖就应运而生 对 就是这么萌的一个名字,好吧,这不是重点
好,我们现在来一步一步看一下这个代码。
先定义函数qiantao,没问题吧;
调用时里面写参数可以传递,没问题吧;
注意了这个return 不知道大家怎么旸,我当时是被整晕了,在这里我们要理解 laoshishuo 和 laoshishuo()有什么区别,简单的来说前者是个内存地址,而后者是把这个内存地址的程序读出来运行,没问题吧;
在这里返回一个laoshishuo 是什么作用呢,瞪大眼睛看下面这一段话,
我们把参数传进这个qiantao之后,qiantao这个函数使用了我们传进去的参数定义了一个函数叫做laoshishuo,
对!!!和你现在想的一样
现在的laoshishuo不再是
print("老实说")
func()
而是
print("老实说")
传进去的参数()
并且存了起来
那么返回laoshishuo这个内存地址,而且是已经变成
print("老实说")
传进去的参数()
的laoshishuo地址
把这个返回值通过语法糖给了text_1那么结果就十分清晰了
所以运行text_1就是运行了这个改变后的laoshishuo
print(“老实说”)
text_1()
这就是我们目的,我们的功能就这样实现了,没有改变源码,没有改变调用方式,
在这之后所有的函数只要前面加上了这个语法糖,那么就可以实现修饰的作用了
没问题吧;
当然在对我们的修饰函数进行稍加修改就可以变成我们最开始的那个代码,没问题吧;
实现的现象如下
好了,这就是我的一点对于装饰器的理解,写的不好,有错误的劳烦各位老师指出,拜谢拜谢