继承方法' Python 中的文档字符串
我有一个带有文档字符串的面向对象层次结构,需要与代码本身一样多的维护。例如,
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
。然而,我想知道是否还有另一种方法可以继承文档字符串,也许是一些我还没有发现的装饰器?
I have an OO hierarchy with docstrings that take as much maintenance as the code itself. E.g.,
class Swallow(object):
def airspeed(self):
"""Returns the airspeed (unladen)"""
raise NotImplementedError
class AfricanSwallow(Swallow):
def airspeed(self):
# whatever
Now, the problem is that AfricanSwallow.airspeed
does not inherit the superclass method's docstring. I know I can keep the docstring using the template method pattern, i.e.
class Swallow(object):
def airspeed(self):
"""Returns the airspeed (unladen)"""
return self._ask_arthur()
and implementing _ask_arthur
in each subclass. However, I was wondering whether there's another way to have docstrings be inherited, perhaps some decorator that I hadn't discovered yet?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这是 Paul McGuire 的 DocStringInheritor 元类的变体。
文档字符串为空。
空的。
任何基类的 MRO,就像常规属性继承一样。
This is a variation on Paul McGuire's DocStringInheritor metaclass.
docstring is empty.
empty.
any of the base classes's MROs, just like regular attribute inheritance.
以类装饰器风格编写一个函数来为您进行复制。在Python2.5中,创建类后直接应用即可。在更高版本中,您可以使用 @decorator 表示法进行应用。
下面是如何做到这一点的第一步:
在较新的 Python 版本中,最后一部分更加简单和美观:
这是一种 Pythonic 技术,与标准库中现有工具的设计完全匹配。例如,functools.total_ordering 类装饰器向类添加缺少的丰富比较方法。再举个例子,functools.wraps< /a> 装饰器将元数据从一个函数复制到另一个函数。
Write a function in a class-decorator style to do the copying for you. In Python2.5, you can apply it directly after the class is created. In later versions, you can apply with the @decorator notation.
Here's a first cut at how to do it:
In newer Python versions, the last part is even more simple and beautiful:
This is a Pythonic technique that exactly matches the design of existing tools in the standard library. For example, the functools.total_ordering class decorator add missing rich comparison methods to classes. And for another example, the functools.wraps decorator copies metadata from one function to another.
供那些刚刚在这个主题上绊倒的人参考:从 Python 3.5 开始,检查。 getdoc 自动从继承层次结构中检索文档字符串。
因此,上面的响应对于 Python 2 很有用,或者如果您想更有创意地合并父级和子级的文档字符串。
我还创建了一些用于文档字符串继承的轻量级工具。它们支持一些开箱即用的默认文档字符串样式(numpy、google、reST)。您也可以轻松使用自己的文档字符串样式
F.Y.I for people just now stumbling on this topic: As of Python 3.5, inspect.getdoc automatically retrieves docstrings from the inheritance hierarchy.
The responses above are thus useful for Python 2, or if you want to be more creative with merging the docstrings of parents and children.
I've also created some lightweight tools for docstring inheritance. These support some nice default docstring styles (numpy, google, reST) out of the box. You can easily use your own docstring style as well
以下改编还处理属性和 mixin 类。我还遇到过一种情况,我必须使用 func.__func__ (对于“instancemethod”),但我不完全确定为什么其他解决方案没有遇到这个问题。
The following adaptation also handles properties and mixin classes. I also came across a situation where I had to use
func.__func__
(for "instancemethod"s), but I'm not completely sure why the other solutions didn't encouter that problem.这是一个非常古老的线程。但是如果有人正在寻找一种简单的方法,您可以使用
__init_subclass__
来完成此操作,只要您继承该类,并且您有权访问父类进行更改,就会调用该方法。It is a very old thread. But If anyone is looking for a simple way, you can do this with
__init_subclass__
which is called whenever you inherit that class, if you have access to parent class to make a change.