装饰器--callable 应用

功能:实现一个@log的decorator,使它既支持:@log     又支持 @log ('excute')

 1 def log6(*args):
 2     if callable(args[0]):
 3         print args  #是个地址 (<function now at 0x0397E1B0>,)
 4         func = args[0]
 5         def wrapper(*args,**kw):
 6             print 'call {}'.format(func.__name__)
 7             return func(*args,**kw)
 8         return wrapper
 9     else:
10         txt=args[0] #第一个 是传进来的参数,没有第二个元素 
11         print args  #是个元组 ('execute',)
12         def decorator(func):
13             @functools.wraps(func)
14             def wrapper(*args,**kw):
15                 print '{}call2 {}'.format(txt,func.__name__)
16                 return func(*args,**kw)
17             return wrapper
18         return decorator #直接返回装饰器 
19     
20 #@log3('execute')
21 #@log3
22 #@log4('begin call:','end call')
23 # now = log(now)
24 @log6
25 #@log6('execute')
26 def now():
27     print '2012-22-33'
28 f=now
29 print f()
30 #装饰器 decorator 
31 #函数对象有一个__name__属性,可以拿到函数的名字:
32 print now.__name__

显示结果:

('execute',)
executecall2 now
2012-22-33
None

 

posted @ 2018-04-12 17:26  一起来编程  阅读(41)  评论(0)    收藏  举报