为什么需要使用装饰器呢?其实很多人学习python之后都会问这个问题。
这一次,我来深入地学习一下什么是装饰器,以及为什么需要它。
其实这个装饰器就是我们这样的程序员太“懒”了,基本上什么事情都想少做,追求是DRY,那么什么是DRY,如下:
DRY(Don't repeat yourself
),字面意思来看:"不要重复自己"。强调的意思就是在进行编程时相同的代码不要重复写,最好只写一次,然后可以在其他地方直接引用。如此一来,可以提高代码重用率,缩减代码量,同时也有助于提高代码的可读性和可维护性。当需要做出更改时,只需要更改一个地方即可。
有了这个指导思想,就很明白了,就是少写代码,装饰器的目的也就是少写代码,复用代码。
复用代码有很多种方式,比如面向对象里的继承,虚函数等,但是想在函数层面来复用代码,有什么方法呢?
一般情况之下,就是函数中调用另一个函数来达到继承和复用。函数里调用别的函数,如下面的例子:
每个函数里添加一行星号就行了,修改如下:
如果你每个函数去添加一个也是可以完成任务的,但是有想法,或者更聪明的办法,就不是这样了。能否不修改原来的函数,即是原来的函数代码一点都不改变,又能增加这样的功能呢?答案是可以的,如下修改:
*************************************
2
*************************************
1
在这里增加了一个函数,这个函数接收一个函数对象作为参数,这样就不需要修改原来的函数,达到原来稳定并且测试通过的代码不作任何修改,减少出错的风险,特别已经上线运行的系统,更是如此;或者像8代单传的代码,没有人敢去修改它,否则领导会怪你,怎么样把产品越改越差,本来是请你来做好产品的,结果不行。做到这一步,就结束了吗?还不行啊,因为每个调用这个函数的地方都需要修改,因此再继续修改,结果改成这样:
五子棋游戏开发
http://edu.csdn.net/course/detail/5487
这一次,我来深入地学习一下什么是装饰器,以及为什么需要它。
其实这个装饰器就是我们这样的程序员太“懒”了,基本上什么事情都想少做,追求是DRY,那么什么是DRY,如下:
DRY(Don't repeat yourself
),字面意思来看:"不要重复自己"。强调的意思就是在进行编程时相同的代码不要重复写,最好只写一次,然后可以在其他地方直接引用。如此一来,可以提高代码重用率,缩减代码量,同时也有助于提高代码的可读性和可维护性。当需要做出更改时,只需要更改一个地方即可。
有了这个指导思想,就很明白了,就是少写代码,装饰器的目的也就是少写代码,复用代码。
复用代码有很多种方式,比如面向对象里的继承,虚函数等,但是想在函数层面来复用代码,有什么方法呢?
一般情况之下,就是函数中调用另一个函数来达到继承和复用。函数里调用别的函数,如下面的例子:
#python 3.6
def add():
return 1 + 1
def sub():
return 2 -1
print(add())
print(sub())
输出如下:
2
1
每个函数里添加一行星号就行了,修改如下:
#python 3.6
def add():
print('*************************************')
return 1 + 1
def sub():
print('*************************************')
return 2 -1
print(add())
print(sub())
输出如下:
*************************************
2
*************************************
1
如果你每个函数去添加一个也是可以完成任务的,但是有想法,或者更聪明的办法,就不是这样了。能否不修改原来的函数,即是原来的函数代码一点都不改变,又能增加这样的功能呢?答案是可以的,如下修改:
#python 3.6
def add():
return 1 + 1
def sub():
return 2 -1
#定义一个新的函数
def printStar(func):
print('*************************************')
return func()
print(printStar(add))
print(printStar(sub))
输出如下:
*************************************
2
*************************************
1
在这里增加了一个函数,这个函数接收一个函数对象作为参数,这样就不需要修改原来的函数,达到原来稳定并且测试通过的代码不作任何修改,减少出错的风险,特别已经上线运行的系统,更是如此;或者像8代单传的代码,没有人敢去修改它,否则领导会怪你,怎么样把产品越改越差,本来是请你来做好产品的,结果不行。做到这一步,就结束了吗?还不行啊,因为每个调用这个函数的地方都需要修改,因此再继续修改,结果改成这样:
#python 3.6
#定义一个新的函数
def printStar(func):
print('*************************************')
return func()
@printStar
def add():
return 1 + 1
def sub():
return 2 -1
print(add)
print(printStar(sub))
输出结果如下:
*************************************
2
*************************************
1
#python 3.6
#定义一个新的函数
def printStar(func):
def f():
print('*************************************')
return func()
return f
@printStar
def add():
return 1 + 1
def sub():
return 2 -1
print(add())
sub = printStar(sub)
print(sub())
输出结果如下:
*************************************
2
*************************************
1
到这里,可以发现使用嵌套函数来实现,就可以返回一个可调用的对象,这样更加完美了。
#python 3.6
#定义一个新的函数
def printStar(func):
def f():
print('*************************************')
return func()
return f
@printStar
def add():
return 1 + 1
@printStar
def sub():
return 2 -1
print(add())
print(sub())
在这里可以发现这两段代码是相等的:
def sub():
return 2 -1
sub = printStar(sub)
和
@printStar
def sub():
return 2 -1
由此可见@printStar是一个语法改变,它的目标就是实现不修改原来函数的代码,又可以复用原来的函数并且作出修改,也称作为元编程,并且装饰器函数可以复用,实现共享的目标。