python装饰器学习笔记

详见

http://coolshell.cn/articles/11265.html

比如:多个decorator

1
2
3
4
@decorator_one
@decorator_two
def func():
     pass

相当于:

1
func  = decorator_one(decorator_two(func))

比如:带参数的decorator:

1
2
3
@decorator (arg1, arg2)
def func():
     pass

相当于:

1
func  = decorator(arg1,arg2)(func)


class式的 Decorator

首先,先得说一下,decorator的class方式,还是看个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class myDecorator( object ):
 
     def __init__( self , fn):
         print "inside myDecorator.__init__()"
         self .fn  = fn
 
     def __call__( self ):
         self .fn()
         print "inside myDecorator.__call__()"
 
@myDecorator
def aFunction():
     print "inside aFunction()"
 
print "Finished decorating aFunction()"
 
aFunction()
 
# 输出:
# inside myDecorator.__init__()
# Finished decorating aFunction()
# inside aFunction()
# inside myDecorator.__call__()



下面这个示例展示了通过URL的路由来调用相关注册的函数示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class   MyApp():
     def   __init__( self ):
         self .func_map  =   {}
  
     def   register( self , name):
         def   func_wrapper(func):
             self .func_map[name]  =   func
             return   func
         return   func_wrapper
  
     def   call_method( self , name = None ):
         func  =   self .func_map.get(name,  None )
         if   func  is   None :
             raise   Exception( "No function registered against - "   +   str (name))
         return   func()
  
app  =   MyApp()
@app .register( '/' def   main_page_func():
     return   "This is the main page."
@app .register( '/next_page' def   next_page_func():
     return   "This is the next page."
  print   app.call_method( '/' print   app.call_method( '/next_page' )

注意:
1)上面这个示例中,用类的实例来做decorator。
2)decorator类中没有__call__(),但是wrapper返回了原函数。所以,原函数没有发生任何变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One_knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值