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

2024-04-20

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

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在每个子类中。但是,我想知道是否还有另一种方法可以继承文档字符串,也许是一些我还没有发现的装饰器?


这是一个变体Paul McGuire 的 DocStringInheritor 元类 http://groups.google.com/group/comp.lang.python/msg/26f7b4fcb4d66c95.

  1. 如果子成员的文档字符串,它继承父成员的文档字符串 文档字符串为空。
  2. 如果子类文档字符串是,它继承父类文档字符串 空的。
  3. 它可以从任何类继承文档字符串 任何基类的 MRO,就像常规属性继承一样。
  4. 与类装饰器不同,元类是继承的,因此您只需在某个顶级基类中设置一次元类,并且文档字符串继承将在整个 OOP 层次结构中发生。

import unittest
import sys

class DocStringInheritor(type):
    """
    A variation on
    http://groups.google.com/group/comp.lang.python/msg/26f7b4fcb4d66c95
    by Paul McGuire
    """
    def __new__(meta, name, bases, clsdict):
        if not('__doc__' in clsdict and clsdict['__doc__']):
            for mro_cls in (mro_cls for base in bases for mro_cls in base.mro()):
                doc=mro_cls.__doc__
                if doc:
                    clsdict['__doc__']=doc
                    break
        for attr, attribute in clsdict.items():
            if not attribute.__doc__:
                for mro_cls in (mro_cls for base in bases for mro_cls in base.mro()
                                if hasattr(mro_cls, attr)):
                    doc=getattr(getattr(mro_cls,attr),'__doc__')
                    if doc:
                        if isinstance(attribute, property):
                            clsdict[attr] = property(attribute.fget, attribute.fset, 
                                                     attribute.fdel, doc)
                        else:
                            attribute.__doc__ = doc
                        break
        return type.__new__(meta, name, bases, clsdict)



class Test(unittest.TestCase):

    def test_null(self):
        class Foo(object):

            def frobnicate(self): pass

        class Bar(Foo, metaclass=DocStringInheritor):
            pass

        self.assertEqual(Bar.__doc__, object.__doc__)
        self.assertEqual(Bar().__doc__, object.__doc__)
        self.assertEqual(Bar.frobnicate.__doc__, None)

    def test_inherit_from_parent(self):
        class Foo(object):
            'Foo'

            def frobnicate(self):
                'Frobnicate this gonk.'
        class Bar(Foo, metaclass=DocStringInheritor):
            pass
        self.assertEqual(Foo.__doc__, 'Foo')
        self.assertEqual(Foo().__doc__, 'Foo')
        self.assertEqual(Bar.__doc__, 'Foo')
        self.assertEqual(Bar().__doc__, 'Foo')
        self.assertEqual(Bar.frobnicate.__doc__, 'Frobnicate this gonk.')

    def test_inherit_from_mro(self):
        class Foo(object):
            'Foo'

            def frobnicate(self):
                'Frobnicate this gonk.'
        class Bar(Foo):
            pass

        class Baz(Bar, metaclass=DocStringInheritor):
            pass

        self.assertEqual(Baz.__doc__, 'Foo')
        self.assertEqual(Baz().__doc__, 'Foo')
        self.assertEqual(Baz.frobnicate.__doc__, 'Frobnicate this gonk.')

    def test_inherit_metaclass_(self):
        class Foo(object):
            'Foo'

            def frobnicate(self):
                'Frobnicate this gonk.'
        class Bar(Foo, metaclass=DocStringInheritor):
            pass

        class Baz(Bar):
            pass
        self.assertEqual(Baz.__doc__, 'Foo')
        self.assertEqual(Baz().__doc__, 'Foo')
        self.assertEqual(Baz.frobnicate.__doc__, 'Frobnicate this gonk.')

    def test_property(self):
        class Foo(object):
            @property
            def frobnicate(self): 
                'Frobnicate this gonk.'
        class Bar(Foo, metaclass=DocStringInheritor):
            @property
            def frobnicate(self): pass

        self.assertEqual(Bar.frobnicate.__doc__, 'Frobnicate this gonk.')


if __name__ == '__main__':
    sys.argv.insert(1, '--verbose')
    unittest.main(argv=sys.argv)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • php oop 如何使用属性和方法形成类

    我是 php oop 的新手 我对类有一些想法 但我仍然不知道如何在创建的对象中使用它的属性和方法 我需要了解下面报告的代码是否正确 如果不正确我做错了什么 我假设我有一个可以为我做任何事情的课程 我们称之为 Class myClass 现
  • 箱线图与箱线图有何不同?

    我想知道当我们在海生图书馆中有箱线图时为什么会有箱线图 我知道一件事是箱线图优化了表示数据的方式 特别是对于大型数据集 但我不知道为什么 除此之外 我没有任何充分的理由使用箱线图 箱线图将中位数显示为中心线 第 50 个百分位数 然后将第
  • 隐藏控制台并执行 python 脚本

    我正在尝试使用 pyinstaller 在 Windows 10 上使用 pyqt5 模块编译在 python 3 中构建的 python 脚本 该脚本在运行时隐藏窗口 为了编译我的脚本 我执行了以下命令 pyinstaller onefi
  • 如何在代码中停止 autopep8 未安装消息

    我是一名新的 Python 程序员 使用 Mac 版本的 VS Code 1 45 1 创建 Django 项目 我安装了 Python 和 Django 扩展 每次我保存 Django 文件时 代码都会弹出此窗口 Formatter au
  • 使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

    我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法 在 Flask 中 g 对象可用于存储内容 并且可以将打开的数据库连接放置在那里 以允许应用程序在同一请求期间的后续数据库查询中重用它们 但是 g
  • 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节?

    unicode 字符串中是否允许空字节 我不问 utf8 我的意思是 unicode 字符串的高级对象表示 背景 我们通过 Python 在 PostgreSQL 中存储包含空字节的 unicode 字符串 如果我们再次读取字符串 字符串会
  • 将图像转换为二进制流

    我的应用程序有两个方面 一方面我使用 C 来使用 Pleora 的 EBUS SDK 从相机读取帧 当第一次接收到该流时 在将缓冲区转换为图像之前 我能够一次读取 16 位流 以便对每个像素执行一些计算 即每个像素都存在一个 16 位数据块
  • 无法将 python 数据框中的列类型从 object 转换为 str

    我已经下载了一个csv文件 然后将其读取到python dataframe 现在所有4列都有对象类型 我想将它们转换为str类型 现在dtypes的结果如下 Name object Position Title object Departm
  • 使用 pythons strftime 显示日期,例如“5 月 5 日”? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 日期顺序输出 https stackoverflow com questions 739241 python date ordinal output 在Python中 time strf
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • NumPy 数组不可 JSON 序列化

    创建 NumPy 数组并将其保存为 Django 上下文变量后 加载网页时收到以下错误 array 0 239 479 717 952 1192 1432 1667 dtype int64 is not JSON serializable
  • 使用 PIL 合并图像时模式不匹配

    我正在传递 jpg 文件的名称 def split image into bands filename img Image open filename data img getdata red d 0 0 0 for d in data L
  • 使用 JSON 可序列化枚举自动生成棉花糖模式

    创建与我的模型相同的棉花糖模式的日子已经一去不复返了 我发现这个优秀的答案 https stackoverflow com a 42892443 4097322这解释了我如何使用简单的装饰器从 SQA 模型自动生成模式 因此我实现了它并替换
  • 是否可以使用 Python 中的密码安全地加密然后解密数据?

    我在 python 程序中有一些数据 我想在使用密码写入文件之前对其进行加密 然后在使用它之前读取并解密它 我正在寻找一些可以根据密码进行加密和解密的安全对称算法 这个问题 https stackoverflow com questions
  • Windows 10 上的 Tensorflow 安装问题

    我正在尝试在 Win 10 计算机上安装 Tensorflow 我成功安装了Python 3 7 然后尝试按照tensorflow org上的安装说明进行操作 执行时 pip install tensorflow 我收到以下错误消息 错误
  • 使用 PuLP 进行线性优化,变量附加条件

    我必须用 Pull 解决 Python 中的整数线性优化问题 我解决了基本问题 现在我必须添加额外的约束 有人可以帮助我用逻辑指示器添加条件吗 逻辑限制是 如果 A gt 20 则 B gt 5 这是我的代码 from pulp impor
  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下
  • 每行中最后一次出现 True 的索引

    我有一个二维数组 a False False False False False True True True True True True True True True True True True True True True True

随机推荐

  • 捕获 Exception 对象是否安全

    我使用依赖于异常的 Java 库 简化代码如下 try val eventTime eventTimeString as Date catch case e Exception gt logger error s Can t parse e
  • pandas,根据某些列值和 NAN 组合行

    所以我有一个 pandas 数据框 如下所示 id 1 id 2 value1 value2 1 2 100 NAN 1 2 NAN 101 10 20 200 NAN 10 20 NAN 202 10 2 345 345 我想要一个像这样
  • 比较 YUI 和 Ext JS [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何收到 SalesForce 中新潜在客户的通知? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望在 Salesforce 中创建新潜在客户时收到通知 Salesforce 中是否有类似 web
  • 自动将 Google 表格中单元格内容大写的脚本?

    我有一个电子表格 可以输入股票代码 我希望它们始终全部大写 无论它们如何输入 这似乎需要一些脚本 因为除非存在该列的第二个副本 否则无法使用函数来执行此操作 这是不可接受的 我有一个有效的解决方案 但有一个关键问题 代码如下 functio
  • ASP.NET (MVC) 提供图像

    我正在创建一个 MVC 3 应用程序 尽管同样适用于其他技术 例如 ASP NET Forms 并且只是想知道从代码提供图像而不是使用直接虚拟路径 像往常一样 是否可行 性能方面 我的想法是改进提供文件的通用方法 应用安全检查 基于路由值的
  • 将特定位置的安全号码更改为 X

    我是新来的 将数字替换为特定位置的某些字符 我有这组号码 123 45 6789 但我只需要显示这样的 XXX XX 6789 但我只需要更改不包括 破折号 的数字 下面是我的示例代码 var mainStr view ssn text v
  • 如何获取计算样式以及该规则的来源? [复制]

    这个问题在这里已经有答案了 我想获取元素计算样式和应用该规则的 css 文件和行 类似于 Chrome 开发工具在使用 计算 选项卡并单击值旁边的箭头时所做的操作 简而言之 我希望能够使用 javascript 找出这两件事 实际应用于该元
  • 为什么网络开发人员仍然使用元关键字和元描述标签?

    谷歌根本不使用元关键字标签因为关键字主要用于垃圾邮件搜索引擎 Google 不使用元描述标签进行排名 有时 如果部分内容不适合 元描述标签会用于搜索结果中的网站片段 但大多数元描述是根据页面内容自动生成的 并且元描述与页面内容的开头相同 谷
  • 为什么这个函数被应用于一个没有作为参数调用的变量?

    我尝试编写的一些代码遇到了问题 我正在尝试获取坐标列表列表 表示 3D 中形状的可能位置 并形成一个列表 其中包含原始列表中的所有元素以及原始列表中旋转的元素 以便 x y z 坐标也被移动以包括 z x y 和 y z x 我认为用一个例
  • 有没有撤消 git flow init 的命令?

    After git flow init 如何去掉git flow模型 如何从中删除所有相关配置 git config file git flow init force reset git flow init f 如何从以下内容中删除 git
  • PHP使用RSA私钥解密数据

    我有一个程序 使用 C rsa 公钥加密密码 输出字节数组 为了让我轻松传输它并维护数据 我将字节直接转换为十六进制字符串 现在这就是我遇到问题的地方 我将发布数据发送到我的脚本 现在不确定将其转换为什么以及如何解密它 我正在尝试使用htt
  • 在 CKEditor 4.x 中,有没有办法在初始化后获取允许的标签列表?

    有没有办法获取 CKEditor 4 x 准确地说是 4 4 7 中所有允许标签的列表after编辑器已使用所有插件进行初始化 并且所有allowedContentRules and disallowedContentRules或已应用任何
  • 模拟 Windows 8 开始菜单平铺布局引擎

    那么有人知道完美模拟 Windows 8 开始菜单平铺布局引擎的示例代码或控件吗 它应该支持混合的方形和矩形瓷砖 并正确地将方形瓷砖重新包装在矩形瓷砖上方或下方 注意 如果所有瓷砖都是正方形 WrapPanel 就可以工作 但是 一旦您混合
  • AirGoogleMaps 目录必须添加到您的 xCode 项目中才能支持 iOS RN48 上的 GoogleMaps

    我在Android项目中安装了react native maps 效果很好 但我总是出现错误 编译良好 但在ios中执行时出现错误 console error react native maps 必须将 AirGoogleMaps 目录添加
  • 如何在docker镜像中运行signalr blazor客户端的StartAsync连接?

    我创建了默认的 blazor 服务器端应用程序 然后添加Microsoft AspNetCore SignalR Client and ChatHub班级 然后编辑startup cs文件 添加services AddSignalR and
  • 在 MongoDB 中执行搜索/投影时如何重命名字段?

    是否可以重命名查找查询中返回的字段名称 我想用类似的东西 rename 但是我不想更改我正在访问的文档 我只想以不同的方式检索它们 其工作原理如下SELECT COORINATES AS COORDS in SQL 我现在应该做什么 db
  • 在 Inno Setup 中添加 4 个许可证页面

    我遵循了马丁的回答here https stackoverflow com questions 34592002 how to create two licensefile pages in inno setup在我的 Inno Setup
  • 递归函数:检查 Java 中的回文数

    我有一个类检查字符串是否是回文 我有两个问题 1 这是检查回文的最有效方法吗 2 这可以递归实现吗 public class Words public static boolean isPalindrome String word Stri
  • 在 Python 中继承方法的文档字符串

    我有一个带有文档字符串的面向对象层次结构 需要与代码本身一样多的维护 例如 class Swallow object def airspeed self Returns the airspeed unladen raise NotImple