新人,关于装饰器的一个有关问题

新人,关于装饰器的一个问题
#my_log.py

import functools

def log(*args):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*ar, **kw):
            print 'call %s():' % ( func.__name__)
            return func(*ar, **kw)
        return wrapper
    return decorator
@log
def now():
print '2014-11-26'

@log('execute')
def now2():
print '2014-11-26'

now()
now2()


以上代码运行的时候会出错,下面是错误信息
新人,关于装饰器的一个有关问题
我推测,在第一个@log的代码处,程序将now作为log的参数传过去了,而导致decorator没有参数了。
还请各位同志不吝赐教!
------解决思路----------------------

@log()    # 这里要加上括号
def now():
    print '2014-11-26'


------解决思路----------------------

def decorator(func):
    def wrapper(*ar, **kw):
        print 'call %s():' % ( func.__name__)
        return func(*ar, **kw)
    return wrapper
return decorator

@decorator
def now():
    print '2014-11-26'

now()

这种类型理解清楚了吗?
------解决思路----------------------

def decorator(func):
    def wrapper(*ar, **kw):
        print 'call %s():' % ( func.__name__)
        return func(*ar, **kw)
    return wrapper
 
@decorator
def now():
    print '2014-11-26'
 now()


少删除了一行
------解决思路----------------------
def deco(arg):
    def _deco(func):
        def __deco():
            func()
        return __deco
    return _deco
 
@deco
def myfunc():
    print(" myfunc() called.")
 
@deco("module2")
def myfunc2():
    print(" myfunc2() called.")
 
myfunc()
myfunc2()


你的错误和以上代码的错误一样,因为你的decorate函数是带参数的,在装饰其他函数时如果不带“()”是有问题的
------解决思路----------------------
也许能做到但不好,从逻辑上来讲应要一致,没参数就该@log()而不是@log
------解决思路----------------------
完全可以实现,楼主可能还没怎么理解装饰器,问的问题未必是这个意思,给个例子:

class test_wrapper(object):
    """
    """
    def __init__(self, *args, **kw):
        if len(kw) == 0 and len(args) == 1 and callable(args[0]):
            self._func_or_wrapper = args[0]
            self.check_value = 0
        else:
            self._func_or_wrapper = None
            for k, v in kw.items():
                setattr(self, k, v)

    def __call__(self, *args, **kw):
        if callable(self._func_or_wrapper):
            print("Calling...")
            print(self.__dict__)
            return self._func_or_wrapper(*args, **kw)
        elif len(kw) == 0 and len(args) == 1 and callable(args[0]):
            self._func_or_wrapper = args[0]
            return self
        else:
            raise Exception("ERROR!")


@test_wrapper
def test(x, y):
    print(x + y)


@test_wrapper(check_value=1)
def test2(x, y):
    print(x - y)

test(1, 2)
test2(3, 2)