python学习--decorator练习

来源:互联网 发布:mac查看电池循环 编辑:程序博客网 时间:2024/04/28 13:47
今天进入第五天学习了,学到 了装饰器,decorator,结尾有个练习:
请编写一个decorator,能在函数调用的前后打印出 'begin call' 和 'end call' 的日志。
再思考一下能否写出一个 @log 的decorator,使它既支持:
@log
def f():
        pass
又支持:
@log('execute')
def f():
        pass


decorator装饰器作用和用法,我不在这里多说,大家自己看资料。
开始分析练习的第一个要求,只要能打印出来就行,于是把廖老师的例程拷贝过来,增加2个print即可
import functools
def log(text):
        def decorator(func):
                @functools.wraps(func)
                def wrapper(*args, **kw):
                        print 'begin:'
                        result = func(*args, **kw)
                        print 'end' 
                        return result
                return wrapper
        return decorator
@log('execute')
def now():
        print '2017-12-22'
print now()

这个例程,我自己实践过,拷贝即可运行了。其实在看到题的第一刻,我有个想法,如何实现把 'begin call' 和 'end call'当做输入变量传进去,然后按这个要求打印,目前还没研究出来,我的目的是这样
import functools
def log(str1,str2):
        def decorator(func):
                @functools.wraps(func)
                def wrapper(*args, **kw):
#                        print 'begin:'
                        print '%s ' % (str1)
                        result = func(*args, **kw)
#                        print 'end' 
                        print '%s ' % (str2)
                        return result
                return wrapper
        return decorator
@log('begin call','end call')
def now():
        print '2017-12-22'
print now()
这个实现2个输入的,如果想实现N多个,我一直没有好的思路,大家有好的建议,给兄弟回复一下,谢谢。
下面开始研究:
写出一个 @log 的decorator,使它既支持:
@log
def f():
        pass
又支持:@log('execute')
def f():
        pass

正研究,搞定了,补充


进入第六天的学习,今早,我突然有个灵感,把参数设置为默认,里面再加个判断不就可以通用了吗?


import functools
def log(str=None):
        def decorator(func):
                @functools.wraps(func)
                def wrapper(*args, **kw):
                                                if(str != None):
                                                        print '%s ' % (str)
                                                else:
                                                        print  '%s %s():' % (str, func.__name__)
                                                return func(*args, **kw)
                return wrapper
        return decorator
@log()
def now():
        print '2017-12-22'
print now()


果然运行成功了,太兴奋了,给大家共享本思路。
很多时候遇到困难,不能解决,不如先放下,换换脑子,说不定会有突发的灵感哦。

原创粉丝点击