当前位置: 首页 > 面试题库 >

在Python中继承方法的文档字符串

有权
2023-03-14
问题内容

我有一个带有文档字符串的OO层次结构,它需要与代码本身一样多的维护。例如,

class Swallow(object):
    def airspeed(self):
        """Returns the airspeed (unladen)"""
        raise NotImplementedError

class AfricanSwallow(Swallow):
    def airspeed(self):
        # whatever

现在,问题在于AfricanSwallow.airspeed它不继承超类方法的文档字符串。我知道我可以使用模板方法模式保留文档字符串,即

class Swallow(object):
    def airspeed(self):
        """Returns the airspeed (unladen)"""
        return self._ask_arthur()

_ask_arthur在每个子类中实现。但是,我想知道是否还有另一种方法来继承文档字符串,也许是我还没有发现的装饰器?


问题答案:

以类装饰器风格编写一个函数来为您执行复制。在Python2.5中,您可以在创建类后直接应用它。在更高版本中,您可以使用@decorator表示法。

这是如何做到的第一步:

import types

def fix_docs(cls):
    for name, func in vars(cls).items():
        if isinstance(func, types.FunctionType) and not func.__doc__:
            print func, 'needs doc'
            for parent in cls.__bases__:
                parfunc = getattr(parent, name, None)
                if parfunc and getattr(parfunc, '__doc__', None):
                    func.__doc__ = parfunc.__doc__
                    break
    return cls


class Animal(object):
    def walk(self):
        'Walk like a duck'

class Dog(Animal):
    def walk(self):
        pass

Dog = fix_docs(Dog)
print Dog.walk.__doc__

在较新的Python版本中,最后一部分更加简单美观:

@fix_docs
class Dog(Animal):
    def walk(self):
        pass

这是一项Pythonic技术,与标准库中现有工具的设计完全匹配。例如,
functools.total_ordering

类装饰器向类添加缺少的丰富比较方法。再举一个例子,
functools.wraps

装饰器将元数据从一个函数复制到另一个函数。



 类似资料:
  • 我有下面的类层次结构。当我为子类生成javadoc时,生成的文档不包含从超类继承的方法的java文档注释。 我正在为子类生成文档。超类中方法的文档为空。

  • 问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理

  • 问题内容: 我是python的初学者。我无法理解继承和。 结果: 还行吧。但我替换为 结果: 在这种情况下,如何访问? 问题答案: 在第一种情况下,是扩展类,并且由于您没有重新定义in中命名的特殊方法,因此它继承自。 当类定义 方法时,类实例化将自动为新创建的类实例调用。 在第二种情况下,由于要重新定义,因此如果要扩展其行为,则需要在超类()中显式调用它。

  • 问题内容: 我想从Javadoc实现的接口继承Javadoc 。我在Javadoc命令中包含了源代码,并正确继承了文档。 现在,我想知道是否可以使它生成的链接指向Web上的文档,而不是在我的网站上复制它,即“ Specified by:”链接将链接到外部页面。 这可能吗? 问题答案: 有可能,是的。为了能够包含继承的文档,必须在javadoc的sourcepath中找到接口A的源,但不应在传递给用

  • 问题内容: 这是一个有趣的代码片段: 我知道子类不会继承其父级的私有成员,但是obj设法在其中调用它不应具有的访问权的方法。在编译时,obj是Superclass类型,在运行时是Subclass类型。 这可能与以下事实有关:对doSomething()的调用发生在驱动程序类内部,而该驱动程序类恰好是其自己的类(以及为什么可以首先调用doSomething()的原因)。 因此问题归结为,obj如何访

  • 问题内容: 在Python中,如果您使用相同的方法定义两个类,并希望这两个类成为父类,则如下所示: 和: 当您定义子类并以A和B的顺序添加两个父类时: 调用self.method()时使用的方法是属于A的方法,即继承列表中的第一个类: 尽管在我所有的测试用例中似乎都是如此,但我无法在文档或在线中找到在任何平台和该语言实现中都可以安全使用的地方。任何人都可以肯定地说,假设列表中的第一个继承的类将始终