inheritancePython类inheritance中的文档string

我想在Python中做一些类inheritance。 我希望每个类和inheritance类有良好的文档。 所以我认为对于inheritance的类,我希望它:

  • inheritance基类docstring
  • 还附加相关的额外文档的文档string

在类inheritance的情况下做这种文档string操作有没有一些“最佳做法”? 如何多重inheritance? 这个地方有什么好的讨论/教程吗?

5 Solutions collect form web for “inheritancePython类inheritance中的文档string”

你并不是唯一的一个! 前段时间有关于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部分将推迟到孩子的部分,否则他们合并在一起,有很好的格式。

  • python:是否可以将控制台连接到正在运行的进程中
  • 在Windows提示错误 - 未知或不支持的命令“安装”
  • 在Python / numpy / pandas中有效检查任意对象是否是NaN?
  • pylint的“太less的公共方法”消息意味着什么
  • Python中的私有构造函数
  • 在re.sub中处理捕获组?
  • Python与C#/ .NET - 使用开发大型Web应用程序时需要考虑哪些关键差异?
  • Python的日志格式可以根据消息日志级别进行修改吗?
  • py.test:将一个parameter passing给一个fixture函数
  • python numpy arange意外的结果
  • Python中枚举的常用做法是什么?