图零直播吧 关注:39贴子:428
  • 0回复贴,共1

无参装饰器

只看楼主收藏回复

(一)无参装饰器的理解
装饰器本身就是一个函数,而且是一个高阶函数
它的形参是一个函数,ps:要被装饰的函数
它的返回值是一个函数
可以使用 @function_name 的方式调用
(二)装饰器的例子
def fn_strengthen(fn):
def wrapper(*args, **kwargs):
print("========start=======")
print("args = {}, kwargs = {}".format(args, kwargs))
result = fn(*args, **kwargs)
print(result)
print("========end=========")
return result
return wrapper
@fn_strengthen # add = fn_strengthen(add)
def add(x, y):
print("==========call add=============")
return x + y
add(4, y=5)
(三)装饰器的副作用
def fn_strengthen(fn):
def wrapper(*args, **kwargs):
print("========start=======")
print("args = {}, kwargs = {}".format(args, kwargs))
result = fn(*args, **kwargs)
print(result)
print("========end=========")
return result
return wrapper
@fn_strengthen # add = fn_strengthen(add)
def add(x, y):
"""This is a function to add"""
print("==========call add=============")
return x + y
print("name = {}, doc = {}".format(add.__name__, add.__doc__)) # name = wrapper, doc = None
注意:可以看出被装饰函数的属性都被替换了,这种问题应该如何解决?
代码改进,再定义一个函数,用来记录被装饰函数的属性:
def fn_strengthen(fn):
def wrapper(*args, **kwargs):
print("========start=======")
print("args = {}, kwargs = {}".format(args, kwargs))
result = fn(*args, **kwargs)
print(result)
print("========end=========")
return result
add_property(fn, wrapper)
return wrapper
def add_property(fn, wrapper):
wrapper.__name__ = fn.__name__
wrapper.__doc__ = fn.__doc__
@fn_strengthen # add = fn_strengthen(add)
def add(x, y):
"""This is a function to add"""
print("==========call add=============")
return x + y
print("name = {}, doc = {}".format(add.__name__, add.__doc__))
上面的方法解决了属性被覆盖的问题,考虑到add_property这个函数的通用性,可以将这个复制属性的函数也改造成装饰器函数,只不过是带参的装饰器,代码改造如下:
def add_property(fn):
def _copy(wrapper):
wrapper.__name__ = fn.__name__
wrapper.__doc__ = fn.__doc__
return wrapper
return _copy
def fn_strengthen(fn):
@add_property(fn) # wrapper = add_property(fn)(wrapper)
def wrapper(*args, **kwargs):
print("========start=======")
print("args = {}, kwargs = {}".format(args, kwargs))
result = fn(*args, **kwargs)
print(result)
print("========end=========")
return result
return wrapper
@fn_strengthen # add = fn_strengthen(add)
def add(x, y):
"""This is a function to add"""
print("==========call add=============")
return x + y
print("name = {}, doc = {}".format(add.__name__, add.__doc__))


1楼2018-09-19 14:06回复