有参数的装饰器演变
1.我的第一篇博客是实现一个无参数的装饰器,代码如下:
def logger(fn):
'''
i am logger documents
:param fn:
:return: wrapper
'''
def wrapper(*args,**kwargs):
'''
:param args: ()
:param kwargs: dict
:return: None
'''
if type(args[0]) != type(args[1]):
print("类型不一致请重试")
return
z = fn(*args, **kwargs)
f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
f.write(str(z))
f.close()
print("finish")
return wrapper
@logger # add1 = logger(add1)
def add(x,y):
'''
:param x:int
:param y: int
:return:int
'''
ret = x + y
return ret
print(add.__name__)
print(add.__doc__)
print(logger.__doc__)
print(logger.__name__)
结果如图,我们发现了一个奇怪的现象,add方法被装饰过后,他自己的属性已经没有了,这显然不是我想要的
2增加交换属性方法copyproperties,调整后的代码如下:
def copyproperties(src,dst):
dst.__name__=src.__name__
dst.__doc__=src.__doc__
def logger(fn):
'''
i am logger documents
:param fn:
:return: wrapper
'''
def wrapper(*args,**kwargs):
'''
:param args: ()
:param kwargs: dict
:return: None
'''
if type(args[0]) != type(args[1]):
print("类型不一致请重试")
return
z = fn(*args, **kwargs)
f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
f.write(str(z))
f.close()
print("finish")
copyproperties(fn, wrapper)
return wrapper
@logger # add1 = logger(add1)
def add(x,y):
'''
i am called add
:param x:int
:param y: int
:return:int
'''
ret = x + y
return ret
print(add.__name__)
print(add.__doc__)
print(logger.__doc__)
print(logger.__name__)
3.柯里化后:
def copyproperties(src):
def copywrapper(dst):
dst.__name__=src.__name__
dst.__doc__=src.__doc__
return dst
return copywrapper
def logger(fn):
'''
i am logger documents
:param fn:
:return: wrapper
'''
def wrapper(*args,**kwargs):
'''
:param args: ()
:param kwargs: dict
:return: None
'''
if type(args[0]) != type(args[1]):
print("类型不一致请重试")
return
z = fn(*args, **kwargs)
f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
f.write(str(z))
f.close()
print("finish")
copyproperties(fn)(wrapper)
return wrapper
@logger # add1 = logger(add1)
def add(x,y):
'''
i am called add
:param x:int
:param y: int
:return:int
'''
ret = x + y
return ret
print(add.__name__)
print(add.__doc__)
print(logger.__doc__)
print(logger.__name__)
4,copyproperties方法是装饰wrapper方法的nt(logger.doc)
def copyproperties(src):
def copywrapper(dst):
dst.__name__=src.__name__
dst.__doc__=src.__doc__
return dst
return copywrapper
def logger(fn):
'''
i am logger documents
:param fn:
:return: wrapper
'''
@copyproperties(fn)
def wrapper(*args,**kwargs):
'''
:param args: ()
:param kwargs: dict
:return: None
'''
if type(args[0]) != type(args[1]):
print("类型不一致请重试")
return
z = fn(*args, **kwargs)
f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
f.write(str(z))
f.close()
print("finish")
# copyproperties(fn)(wrapper)
return wrapper
@logger # add1 = logger(add1)
def add(x,y):
'''
i am called add
:param x:int
:param y: int
:return:int
'''
ret = x + y
return ret
print(add.__name__)
print(add.__doc__)
print(logger.__doc__)
print(logger.__name__)
运行后add方法的属性被顺利交换.实现了一个简单的装饰器应用.