本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下:
用类作为装饰器
示例一
最初代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class bol( object ): def __init__( self , func): self .func = func def __call__( self ): return "<b>{}</b>" . format ( self .func()) class ita( object ): def __init__( self , func): self .func = func def __call__( self ): return "<i>{}</i>" . format ( self .func()) @bol @ita def sayhi(): return 'hi' |
改进一:
1
2
3
4
5
6
7
8
9
10
11
|
class sty( object ): def __init__( self , tag): self .tag = tag def __call__( self , f): def wraper(): return "<{tag}>{res}</{tag}>" . format (res = f(), tag = self .tag) return wraper @sty ( 'b' ) @sty ( 'i' ) def sayhi(): return 'hi' |
改进二:
1
2
3
4
5
6
7
8
9
10
11
12
|
class sty( object ): def __init__( self , * tags): self .tags = tags def __call__( self , f): def wraper(): n = len ( self .tags) return "{0}{1}{2}" . format (( '<{}>' * n). format ( * self .tags), f(), ( '</{}>' * n). format ( * reversed ( self .tags))) return wraper @sty ( 'b' , 'i' ) def sayhi(): return 'hi' print (sayhi()) |
改进三:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class sty( object ): def __init__( self , * tags): self .tags = tags def __call__( self , f): def wraper( * args, * * kwargs): n = len ( self .tags) return "{0}{1}{2}" . format (( '<{}>' * n). format ( * self .tags), f( * args, * * kwargs), ( '</{}>' * n). format ( * reversed ( self .tags))) return wraper @sty ( 'b' , 'i' ) def say(word = 'Hi' ): return word print (say()) print (say( 'Hello' )) |
示例二
最初代码:
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
|
import threading import time class DecoratorClass( object ): def __init__( self ): self .thread = None def __call__( self , func, * args, * * kwargs): def wrapped_func( * args, * * kwargs): curr_thread = threading.currentThread().getName() self .thread = curr_thread print ( '\nthread name before running func:' , self .thread) ret_val = func() print ( '\nthread name after running func:' , self .thread) return ret_val return wrapped_func @DecoratorClass () def decorated_with_class(): print ( 'running decorated w class' ) time.sleep( 1 ) return threads = [] for i in range ( 5 ): t = threading.Thread(target = decorated_with_class) threads.append(t) t.setDaemon( True ) # 守护 t.start() |
改进:进程锁
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
|
import threading import time class DecoratorClass( object ): def __init__( self ): self .thread = None self .lock = threading.Lock() def __call__( self , func, * args, * * kwargs): def wrapped_func( * args, * * kwargs): self .lock.acquire() curr_thread = threading.currentThread().getName() self .thread = curr_thread print ( 'thread name before running func:' , self .thread) ret_val = func() print ( '\nthread name after running func:' , self .thread) self .lock.release() return ret_val return wrapped_func @DecoratorClass () def decorated_with_class(): print ( 'Let me sleep 1 second...' ) time.sleep( 1 ) return threads = [] for i in range ( 5 ): t = threading.Thread(target = decorated_with_class) threads.append(t) t.start() |
希望本文所述对大家Python程序设计有所帮助。