首页 > 技术文章 > 装饰器

wangyao2317072926 2017-10-19 10:56 原文

 

 

 

 

简单装饰器:

 

写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

 

封闭:已实现的功能代码块

 

开放:对扩展开发

 

def outer(function):
def inner():
print("123")
ret = function()
#return ret
return inner
@outer
def f1():
print("456")
f1()
运行后结果123 456
原理:将函数名f1当作参数传进outer函数执行outer函数 然后再赋值给f1
    f1 =outer(f1) function=f1
    outer函数的返回值是inner函数名 所以f1 = inner
    重新执行f1()就是执行inner() 所以执行完123 后执行456
可以有多个参数
def w1(func):
 2     def inner(arg1,arg2,arg3):
 3         # 验证1
 4         # 验证2
 5         # 验证3
 6         return func(arg1,arg2,arg3)
 7     return inner
 8 
 9 @w1
10 def f1(arg1,arg2,arg3):
11     print 'f1'

可以装饰具有处理n个参数的函数的装饰器
def w1(func):
    def inner(*args,**kwargs):
        # 验证1
        # 验证2
        # 验证3
        return func(*args,**kwargs)
    return inner
 
@w1
def f1(arg1,arg2,arg3):
    print 'f1'

多个装饰器应用到同一个函数
def outer(function):
def inner(*args,**kwargs):
print("123")
function(*args,**kwargs)
# return ret
return inner
def outer1(function):
def inner1(*args,**kwargs):
print("wangyao")
function(*args,**kwargs)
return inner1
@outer
@outer1
def f1(a1,a2,a3):
print("456")
f1(1,2,3)
结果是123 wangyao 456
@outer1被替换成inner1()函数
再将inner1()函数应用到@outer装饰器中

 
 



推荐阅读