python作为一切皆对象的语言,可以说把面向对象用的了极致。
对于partial对象,如果没有__name__和__doc__,对于装饰器来说很难调试,使用update_wrapper(),来装饰函数对象。
def wrap(func):
def call_it(*args,**kwargs):
"""wrap func: call_it"""
print('before call')
return func(*args,**kwargs)
return call_it
@wrap
def hello():
"""say hello"""
print("hello world")
from functools import update_wrapper
def wrap2(func):
def call_it(*args, **kwargs):
"""wrap func: call_it2"""
print('before call')
return func(*args, **kwargs)
return update_wrapper(call_it, func)
@wrap2
def hello2():
"""test hello"""
print('hello world2')
if __name__ == '__main__':
hello()
print(hello.__name__)
print(hello.__doc__)
print()
hello2()
print(hello2.__name__)
print(hello2.__doc__)
执行结果
before call
hello world
call_it
wrap func: call_it
before call
hello world2
hello2
test hello