inheritancePython类inheritance中的文档string
我想在Python中做一些类inheritance。 我希望每个类和inheritance类有良好的文档。 所以我认为对于inheritance的类,我希望它:
- inheritance基类docstring
- 还附加相关的额外文档的文档string
在类inheritance的情况下做这种文档string操作有没有一些“最佳做法”? 如何多重inheritance? 这个地方有什么好的讨论/教程吗?
你并不是唯一的一个! 前段时间有关于comp.lang.python
的讨论,并且创build了一个配方。 看看这里 。
""" doc_inherit decorator Usage: class Foo(object): def foo(self): "Frobber" pass class Bar(Foo): @doc_inherit def foo(self): pass Now, Bar.foo.__doc__ == Bar().foo.__doc__ == Foo.foo.__doc__ == "Frobber" """ from functools import wraps class DocInherit(object): """ Docstring inheriting method descriptor The class itself is also used as a decorator """ def __init__(self, mthd): self.mthd = mthd self.name = mthd.__name__ def __get__(self, obj, cls): if obj: return self.get_with_inst(obj, cls) else: return self.get_no_inst(cls) def get_with_inst(self, obj, cls): overridden = getattr(super(cls, obj), self.name, None) @wraps(self.mthd, assigned=('__name__','__module__')) def f(*args, **kwargs): return self.mthd(obj, *args, **kwargs) return self.use_parent_doc(f, overridden) def get_no_inst(self, cls): for parent in cls.__mro__[1:]: overridden = getattr(parent, self.name, None) if overridden: break @wraps(self.mthd, assigned=('__name__','__module__')) def f(*args, **kwargs): return self.mthd(*args, **kwargs) return self.use_parent_doc(f, overridden) def use_parent_doc(self, func, source): if source is None: raise NameError, ("Can't find '%s' in parents"%self.name) func.__doc__ = source.__doc__ return func doc_inherit = DocInherit
您可以轻松地连接文档:
class Foo(object): """ Foo Class. This class foos around. """ pass class Bar(Foo): """ Bar class, children of Foo Use this when you want to Bar around. parent: """ __doc__ += Foo.__doc__ pass
但是,这是没用的。 大多数文档生成工具(包括Sphinx和Epydoc )将已经拉取父文档string,包括方法。 所以你不必做任何事情。
不是特别优雅,但简单直接:
class X(object): """This class has a method foo().""" def foo(): pass class Y(X): __doc__ = X.__doc__ + ' Also bar().' def bar(): pass
现在:
>>> print Y.__doc__ This class has a method foo(). Also bar().
可以保留inheritance的文档string语法和首选sorting的混合样式可以是:
class X(object): """This class has a method foo().""" def foo(): pass class Y(X): """ Also bar().""" __doc__ = X.__doc__ + __doc__ def bar(): pass
与Alex的一样:
>>> print Y.__doc__ This class has a method foo(). Also bar().
薄冰:玩文档string可以使你的模块不能用python -OO
,期望一些:
TypeError: cannot concatenate 'str' and 'NoneType' objects
我写了custom_inherit来提供一些简单,轻量级的工具来处理docstringinheritance。
它还带有一些不错的默认样式,用于合并不同types的文档(例如Numpy,Google和reST格式的文档string)。 你也可以很容易地提供你自己的风格。
重叠的文档string部分将推迟到孩子的部分,否则他们合并在一起,有很好的格式。