文档字符串
Python的文档
Python是文档字符串Documentation Strings
在函数语句块的第一行,且习惯是多行的文本,所以多使用三引号
惯例是首字母大写,第一行写概述,空一行,第三行写详细描述
可以使用特殊属性__doc__访问这个文档
def add(x,y):
"""This is a function of addition"""
a = x+y
return x + y
print("name={}\ndoc={}".format(add.__name__, add.__doc__))
print(help(add))
函数被装饰后副作用:原函数对象(被封装函数)的属性都被替换
#副作用:原函数对象(被封装函数)的属性都被替换
def logger(fn):
def wrapper(*args,**kwargs):
'I am wrapper'
print('begin')
x = fn(*args, **kwargs)
print('end')
return x
return wrapper
@logger #add = logger(add)
def add(x,y):
'''This is a function for add'''
return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))
copy_properties函数
提供一个函数,被封装函数属性 copy> 包装函数属性,即:copy_properties(fn被包装函数, wrapper包装函数)
def copy_properties(src, dst): # 可以改造成装饰器 src被包装函数;dst包装函数
dst.__name__ = src.__name__
dst.__doc__ = src.__doc__
def logger(fn):
def wrapper(*args,**kwargs):
'I am wrapper'
print('begin')
x = fn(*args,**kwargs)
print('end')
return x
copy_properties(fn, wrapper)
return wrapper
@logger #add = logger(add)
def add(x,y):
'''This is a function for add'''
return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))
通过copy_properties函数将被包装函数的属性覆盖掉包装函数
凡是被装饰的函数都需要复制这些属性,copy_properties函数通用性强
可以将复制属性的函数构建成装饰器函数,带参装饰器
提供一个函数,被封装函数属性 copy> 包装函数属性,改造成带参装饰器
def copy_properties(src):
def _copy(dst):
dst.__name__=src.__name__
dst.__doc__=src.__doc__
return dst
return _copy
def logger(fn):
@copy_properties(fn) # wrapper = copy_properties(fn)(wrapper)
def wrapper(*args,**kwargs):
'I am wrapper'
print('begin')
x = fn(*args, **kwargs)
print('end')
return x
return wrapper
@logger #add = logger(add)
def add(x,y):
'''This is a function for add'''
return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))