python学习笔记--装饰器

Posted day顾小北

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习笔记--装饰器相关的知识,希望对你有一定的参考价值。

1.首先是一个很无聊的函数,实现了两个数的加法运算:

def f(x,y):
    print x+y
f(2,3)

输出结果也ok

5

2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调:

def showInfo(fun):
    def wrap(x,y):
        print "The function before"
        func(x,y)
        print "The function after"
    return wrap

def f(x,y):
    print x+y

f = showInfo(f)
f(2,3)

此时的输出:

The function before
5
The function after

3.此时我们又定义了一个f1()函数也希望它和f()函数有一样的输出格式,只要在f1()执行之前调用一次showInfo()函数:

def showInfo(fun):
    def wrap(x,y):
        print "The function before"
        func(x,y)
        print "The function after"
    return wrap

def f1(x,y):
    print x*y

f1 = showInfo(f1)
f1(2,3)
The function before
6
The function after

4.此时我知道你应该大概解到了函数修饰的作用了,可是你会发现我们本义是想调用f()函数的,可是在调用的过程中使用了两次调用才得到了我们想要的效果。所以我们使用python提供的装饰器方法来修改我们的代码:

def showInfo(func):
     def wrap(x,y):
        print "The function before"
        func(x,y)
        print "The function after"
    return wrap

 @showInfo
 def f(x,y):
   print x+y
 
 @showInfo
 def f1(x,y):
     print x*y
 
 f(2,3)
 f1(2,3)

这次的结果如下,我们只需直接调用我们要用的函数就得到了我们想要的结果了:

The function before
5
The function after
The function before
6
The function after

总结:这正是python装饰器意义所在的地方。python中的可调用对象包括函数 方法 实现了__call__方法的类。python中的函数也是对象,可以作为高阶函数的参数传入或返回值返回。因此我们可以用高阶函数对某个函数进行封装,这就是python中的装饰器。他的语法结构类似这样:

@decorator
def func(func):
  pass

 

以上是关于python学习笔记--装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记之装饰器(语法糖)

python学习笔记:装饰器生成器内置函数json

Python 3 学习笔记----装饰器

安全牛学习笔记python学习笔记

python学习笔记:装饰器生成器内置函数json

python学习笔记:装饰器生成器内置函数json