python教程—继承方法# 39;在Python文档字符串-Python实用宝典

python教程—继承方法# 39;在Python文档字符串

我有一个带有文档字符串的OO层次结构,它需要和代码本身一样多的维护。现在的问题是非洲的答案是允许的。airspeed不继承超类方法的docstring。我知道我可以使用模板方法模式保存文档字符串,即

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

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

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

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

并在每个子类中实现_ask_arthur。然而,我想知道是否还有另一种方法来继承docstring,也许是一些我还没有发现的装饰器?

回答

用类装饰器样式编写函数,以便为您进行复制。在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

这是一种python技术,与标准中现有工具的设计完全匹配。例如,functools。total_ordered 类装饰器向类添加了缺少的富比较方法。对于另一个例子,functools。包装装饰器将元数据从一个函数复制到另一个函数。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论