首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python类继承中继承文档字符串

在Python类继承中继承文档字符串
EN

Stack Overflow用户
提问于 2010-01-08 12:45:12
回答 5查看 35.5K关注 0票数 106

我正在尝试用Python做一些类继承。我希望每个类和继承的类都有好的文档字符串。所以我认为对于继承的类,我希望它:

  • 继承基类docstring
  • maybe将相关的额外文档附加到docstring

在类继承的情况下,有没有什么方法(可能是优雅的或者pythonic式的)来做这种文档字符串操作?那么多重继承呢?

EN

回答 5

Stack Overflow用户

发布于 2010-01-08 12:51:36

你不是唯一一个!不久前在comp.lang.python上有一个关于这方面的讨论,并创建了一个食谱。请查看。

代码语言:javascript
复制
"""
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 
票数 44
EN

Stack Overflow用户

发布于 2010-01-08 12:55:23

您可以轻松地连接文档字符串:

代码语言:javascript
复制
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

然而,这是无用的。大多数文档生成工具(包括SphinxEpydoc )将已经提取父文档字符串,包括方法。所以你不需要做任何事。

票数 43
EN

Stack Overflow用户

发布于 2010-01-08 12:59:25

不是特别优雅,但简单直接:

代码语言:javascript
复制
class X(object):
  """This class has a method foo()."""
  def foo(): pass

class Y(X):
  __doc__ = X.__doc__ + ' Also bar().'
  def bar(): pass

现在:

代码语言:javascript
复制
>>> print Y.__doc__
This class has a method foo(). Also bar().
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2025562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档