码迷,mamicode.com
首页 > 编程语言 > 详细

python——装饰器

时间:2015-11-20 21:42:43      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

装饰器是什么呢?

我们先来打一个比方,我写了一个python的插件,提供给用户使用,但是在使用的过程中我添加了一些功能,可是又不希望用户改变调用的方式,那么该怎么办呢?

这个时候就用到了装饰器。装饰器的原理是什么?我们接下来就一步一步看过来!

假如我们有一个home函数如下:

1 def home():
2     print this is the home page!

而我们希望用户在访问home函数之前先验证一下权限,那么在不改变用户调用方法的情况下,就需要在home中调用一个login函数,就像这样:

1 def login(usr):
2     if usr == Eva_J:
3         return True
4 def home():
5     result = login()
6     if result:
7         print this is the home page!

这样可以实现我们的需求,但是我们看到home的代码发生了很大的变化,所有的代码都要被包裹在一个if语句中,并且要进行缩进,这往往不是我们希望看到的。那么我们还可以怎么做呢?
首先我们看一个小栗子:

def home():
    print this is the home page!

print home

输出:<function home at 0x000000000219C978>

我们定义了一个home函数,但是并不使用home()调用它,而是让程序打印出home方法的地址。

那么我们再看这段代码:

 1 def login(usr):
 2     if usr == Eva_J:
 3         return True
 4 def wrapper(funcname):
 5     if login(Eva_J):
 6         return funcname
 7 def home():
 8     print this is the home page!
 9 
10 home = wrapper(home)
11 home()
输出的结果:this is the home page!

我们可以看到这段代码的点睛之笔就在这句:“home = wrapper(home)”,我们将home函数的地址当做参数传给了wrapper方法,在wrapper方法中进行验证,验证通过之后再将home方法的地址返回,这个之后再调用home,我们就在没有修改home方法的情况下,调用了home,是不是方便了很多?这就是装饰器的概念!
但是很快我们发现这种方法还是不好,因为用户必须加上那句点睛之笔的代码再执行原本想执行的home方法,于是在python中就规定装饰器可以这样使用:

 1 def login(usr):
 2     if usr == Eva_J:
 3         return True
 4 
 5 def wrapper(funcname):
 6     if login(aaa):
 7         return funcname
 8 
 9 @wrapper
10 def home():
11   print this is the home page!
12
13 home()

看到了吧,我们只需要在home方法上加上一个“@wrapper”,就可以省去原本在home()方法前写的那句话了,这样就方便了很多,而且也没有改变用户的调用方式。
然而,你有没有想过,怎么使用装饰器传递参数?

def home(usr):
    print this is the home page!

 

python——装饰器

标签:

原文地址:http://www.cnblogs.com/Eva-J/p/4977823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!