我目前正在实现一个API,我需要在其上修饰类Wrapper
,但我希望它保留其docstring以使其可供API用户使用。看一下以下最小的工作示例:
class ClassDecorator:
"""ClassDecorator docstring
"""
def __init__(self, enableCache=True):
self.enableCache = enableCache
def __call__(self, wrapper):
def numericalmathfunction(*args, **kwargs):
func = wrapper(*args, **kwargs)
return func
return numericalmathfunction
@ClassDecorator(enableCache=True)
class Wrapper(object):
"""Wrapper docstring
Instructions on how to use the Wrapper
"""
def __init__(self, p):
self.p = p
model = Wrapper(4)
print model.__doc__
print Wrapper.__doc__
返回
Wrapper docstring
None
Wrapper
的实例确实保留了文档字符串,这很好,但Wrapper
本身没有。如果用户想要了解如何使用Wrapper
使用help(Wrapper)
,则他无法获得他想要的内容。
我知道我可以将dosctring复制粘贴到numericalmathfunction
中,但装饰器将用于具有不同文档字符串的几个类。
有关如何使numericalmathfunction
系统地继承包装类的文档字符串的任何想法?
答案 0 :(得分:4)
使用functools.wraps()
更新装饰器的属性:
from functools import wraps
class ClassDecorator:
"""ClassDecorator docstring
"""
def __init__(self, enableCache=True):
self.enableCache = enableCache
def __call__(self, wrapper):
@wraps(wrapper) # <-----------
def numericalmathfunction(*args, **kwargs):
func = wrapper(*args, **kwargs)
return func
return numericalmathfunction
@ClassDecorator(enableCache=True)
class Wrapper(object):
"""Wrapper docstring
Instructions on how to use the Wrapper
"""
def __init__(self, p):
self.p = p
查看functools.wrap的更多标准库文档。