Python怎么将两个功能相同的装饰器高阶函数,一个带参数一个不带参数的合并成一个装饰器?请前辈指点一二,十分感谢?
高洛峰
高洛峰 2016-10-24 17:12:13
[Python讨论组]

Python的装饰器怎么将两个功能相同的函数,一个带参数一个不带参数的合并成一个函数?

获取本地时间方法

def get_now_local_time():
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

装饰器1

def log1(func):
    @functools.wraps(func)  # 保持传入的函数名称不被返回函数改变
    def wrapper(*args, **kwargs):
        print('%s %s():' % ("begin call", func.__name__))
        call_func_ref = func(*args, **kwargs)
        print('%s %s():' % ("end call", func.__name__))
        return call_func_ref
    return wrapper
@log1       # 为函数添加无参数装饰器
def now():
    print('Current local time:' + get_now_local_time())
now()

无参装饰器函数调用输出

begin call now():
Current local time:2016-10-12 23:51:11
end call now():

装饰器2

def log2(text=None):
    def decorator(func):
        @functools.wraps(func)  # 保持传入的函数名称不被返回函数改变
        def wrapper(*args, **kwargs):
            print('%s %s():' % (("begin " + text), func.__name__))
            call_func_ref = func(*args, **kwargs)
            print('%s %s():' % (("end " + text), func.__name__))
            return call_func_ref
        return wrapper
    return decorator
@log2('execute current the function')    # 为函数添加带参数装饰器
def now():
    print('Current local time:' + get_now_local_time())
now()

带有参装饰器函数调用输出

begin execute current the function now():
Current local time:2016-10-12 23:49:25
end execute current the function now():

想做完成这两个函数的合并编码,该怎么写?请大牛前辈给指点一下呗,谢谢~~~


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
三叔
# -*- coding: utf-8 -*-import functoolsimport timedef get_now_local_time():
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*arg, **kwarg):
            print('%s, %s()' % ('begin call',func.__name__) if callable(text) else \             '%s %s():' % (("begin " + text), func.__name__))
            func(*arg, **kwarg)
            print('%s, %s()' % ('end call', func.__name__) if callable(text) else \             '%s %s():' % (("end " + text), func.__name__))        return wrapper    return decorator(text) if callable(text) else decorator@logdef now():
    print('Current local time:' + get_now_local_time())
now()

print('==' * 50)@log('execute current the function')    # 为函数添加带参数装饰器def now():
    print('Current local time:' + get_now_local_time())
now()

需求是不是这样子的

1.png

callable(object)的文档解释

1.png

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号