Python 的装饰器如何既支持 @deco 也支持 @deco(p) 调用?
天蓬老师
天蓬老师 2017-04-17 13:47:31
[Python讨论组]
def deco(*args):
    def _deco(func):
        def __deco():
            print("before %s called [%s]." % (func.__name__, args))
            func()
            print("  after %s called [%s]." % (func.__name__, args))
        return __deco
    return _deco

@deco("mymodule")  # 可用
def myfunc():
    print(" myfunc() called.")

@deco()   # 也可用
def myfunc2():
    print(" myfunc2() called.")

@deco   # 报错 TypeError: _deco() takes exactly 1 argument
def myfunc3():
    print(" myfunc2() called.")

myfunc()
myfunc2()
myfunc3()
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
黄舟

没有参数的 @deco 其实就是 deco(myfunc3),所以需要对参数做个判断就行。

import types

def deco(*args):
    def _deco(func):
        def __deco():
            print("before %s called [%s]." % (func.__name__, args))
            func()
            print("  after %s called [%s]." % (func.__name__, args))
        return __deco

    # 当直接使用 @deco 定义的时候第一个参数为函数
    if len(args) == 1 and type(args[0]) is types.FunctionType:
        return _deco(args[0])

    return _deco
巴扎黑
def decorator(func_text):

    def decorator1(func):

        def wapper(*args, **kw):

            print 'before func...%s' % func_text

            func(*args, **kw)

            print 'after func...%s' % func_text

        return wapper   



    def decorator2(*args, **kw):

        print "before...%s" % func_text.__name__

        func_text(*args, **kw)

        print "after...%s" % func_text.__name__



    if hasattr(func_text, '__call__'):

        return decorator2

    else:

        return decorator

@decorator
def foo2(a,b):

print a

print b

print "foo2"



@decorator('decorator')
def foo3(a,b):
print a

print b

print "foo3"



foo2('a', 'b')

foo3('a', 'b')

@deco 和 @deco()是不一样的

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

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