新人,关于装饰器的一个有关问题
新人,关于装饰器的一个问题
以上代码运行的时候会出错,下面是错误信息
我推测,在第一个@log的代码处,程序将now作为log的参数传过去了,而导致decorator没有参数了。
还请各位同志不吝赐教!
------解决思路----------------------
------解决思路----------------------
这种类型理解清楚了吗?
------解决思路----------------------
少删除了一行
------解决思路----------------------
你的错误和以上代码的错误一样,因为你的decorate函数是带参数的,在装饰其他函数时如果不带“()”是有问题的
------解决思路----------------------
也许能做到但不好,从逻辑上来讲应要一致,没参数就该@log()而不是@log
------解决思路----------------------
完全可以实现,楼主可能还没怎么理解装饰器,问的问题未必是这个意思,给个例子:
#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)