装饰器是什么呢?
我们先来打一个比方,我写了一个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!‘1213 home()
看到了吧,我们只需要在home方法上加上一个“@wrapper”,就可以省去原本在home()方法前写的那句话了,这样就方便了很多,而且也没有改变用户的调用方式。
然而,你有没有想过,怎么使用装饰器传递参数?
def home(usr): print ‘this is the home page!‘
时间: 2024-11-03 16:22:57