装饰器

我们用一个最简单的代码解释一下装饰器的概念,其实装饰器就是一个函数,以另一个函数作为参数,这样就给这个参数函数添加了额外的功能。我们看看下面这段代码:

复制代码
def deco(func):
    print('before func')
    func()
    print('after func')
    return func

def func():
    print('func running')

deco(func)
复制代码

 

运行结果为:

>>> 
before func
func running
after func

 

 

不过,通常为了简写代码,都是使用@符号,下面这段代码和上面是一样的。

复制代码
def deco(func):
    print('before func')
    func()
    print('after func')
    return func

@deco
def func():
    print('func running')
复制代码

 

可以看一下这段代码的输出结果:

>>> 
before func
func running
after func

 

更通用的写法是使用内嵌函数,然后在返回这个内嵌函数,这样做可以的好处后面你会感受到

复制代码
def deco(func):
    def _deco():
        print('before func')
        func()
        print('after func')
    return _deco

@deco
def func():
    print('func running')

func()
复制代码

 

它的运行结果是:

>>> 
before func
func running
after func

 

假如参数函数是带参数的,看下面的代码,这时候你就看到内嵌函数装饰器的好处了。可以对参数进行处理

复制代码
def deco(func):
    def _deco(x,y):
        print('before func')
        func(x,y)
        print('after func')
    return _deco

@deco
def func(a,b):
    print(str(a) + '' + str(b))

func(1,2)
复制代码

 

运行结果是这样的:

>>> 
before func
1和2
after func

 

现在我们要处理更加复杂的问题,我们要装饰的函数不仅仅有两个参数的,还有三个参数的,我们使用星号。一个星号表示列表型参数,两个星号表示字典型参数

复制代码
def deco(func):
    def _deco(*x,**y):
        print('before func')
        func(*x,**y)
        print('after func')
    return _deco

@deco
def func(a,b):
    print(str(a) + '' + str(b))

@deco
def func2(a,b,c):
    print (str(a) + '' + str(b) + '' + str(c))

func(1,2)
func2(1,2,3)
复制代码

 

输出结果是这样的:

>>> 
before func
1和2
after func
before func
1和2和3
after func

 

posted @   SingleDiego  阅读(131)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示