使用 @abstractproperty 和 @abstractmethod 实现/覆盖的实际差异

2024-05-05

考虑一个抽象基类,它具有您希望每个后续子类重写的函数。使用 abc 模块和 ABCMeta;装饰有@abstractproperty or @abstractmethod实际上强制子类/开发人员实现创建装饰器指定的函数类型?根据我的实验,您可以使用子类中的方法覆盖抽象属性,并使用子类中的属性覆盖抽象方法。

这个观念不正确吗?


这个想法是正确的;这ABCMeta代码不区分abstractproperty and a abstractmethod.

这两个装饰器都向装饰项添加属性,.__isabstractmethod__, which ABCMeta用于添加一个.__abstractmethods__属性(一个frozenset) 到您定义的 ABC。这object然后 type 防止创建任何类的实例,其中列出的任何名称.__abstractmethods__没有具体的实现。不对那里的函数和属性进行检查。

为了显示:

>>> from abc import *
>>> class C:
...     __metaclass__ = ABCMeta
...     @abstractmethod
...     def abstract_method(self): pass
...     @abstractproperty
...     def abstract_property(self): return 'foo'
... 
>>> C.__abstractmethods__
frozenset(['abstract_method', 'abstract_property'])

通过在子类中为这些创建新的覆盖,ABCMeta类会发现更少的方法或属性. __isabstractmethod__属性,从而使得结果__abstractmethods__设置较小;一旦集合为空,您就可以创建此类子类的实例。

这些检查是在ABCMeta.__new__构造函数 http://hg.python.org/cpython/file/2.7/Lib/abc.py#l86并且不检查是否匹配描述符类型:

cls = super(ABCMeta, mcls).__new__(mcls, name, bases, namespace)
# Compute set of abstract method names
abstracts = set(name
             for name, value in namespace.items()
             if getattr(value, "__isabstractmethod__", False))
for base in bases:
    for name in getattr(base, "__abstractmethods__", set()):
        value = getattr(cls, name, None)
        if getattr(value, "__isabstractmethod__", False):
            abstracts.add(name)
cls.__abstractmethods__ = frozenset(abstracts)

你必须创建一个子类ABCMeta覆盖__new__方法,并检查基类上命名的任何抽象方法或属性确实与非抽象方法或属性匹配cls反而。

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

使用 @abstractproperty 和 @abstractmethod 实现/覆盖的实际差异 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • Pandas Merge (pd.merge) 如何设置索引和连接

    我有两个 pandas 数据框 dfLeft 和 dfRight 以日期作为索引 dfLeft cusip factorL date 2012 01 03 XXXX 4 5 2012 01 03 YYYY 6 2 2012 01 04 XX
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem

随机推荐

  • 如何在redux中设置初始状态

    我试图弄清楚如何在 redux 中设置商店的初始状态 我在用着https github com reactjs redux blob master examples todos with undo reducers index js htt
  • 如何在 CSS 选择器中使用 JSF 生成的带有冒号“:”的 HTML 元素 ID?

    我一直在使用 JSF 处理一个简单的 Java EE 项目
  • ASP.NET MVC 中的异步控制器

    我检查了 MVC 4 0 中的 System Web Mvc AsyncController 它有注释 提供与 ASP NET MVC 3 的向后兼容性 这是否意味着 MVC 4 中有异步控制器的新实现 MVC 4 0 启用异步控制器以便将
  • DDD 聚合和值对象

    我想问一下关于DDD功能的问题 假设我们有两个聚合 每个聚合都包含值对象地址 根据 Eric Evans DDD 我们应该将聚合彼此隔离 因此第一个聚合的聚合根不能有指向 Address 的链接 坦白说 这对我来说似乎没有意义 所以问题是如
  • 在 Android 的 Exoplayer 中使用 flac 扩展

    我正在尝试使用 ExoPlayer 库FLAC 扩展 https github com google ExoPlayer tree release v2 extensions flac在我的安卓应用程序中 我面临以下问题 并非所有文件都可以
  • 将pillow Image对象转换为JpegImageFile对象

    我裁剪了一张 jpeg 图像 但裁剪后的图像类型是
  • 在保存对话框wxpython中实现“另存为”

    我有一个保存例程 应通过以下方式提示用户 如果当前选择的文件名存在 则提示覆盖 如果当前选择的文件名为空 即 则设置一个对话框要求用户插入文件名 如果当前选择的文件名不存在 则保存 我的代码目前如下所示 但我觉得应该有更好的方法来做到这一点
  • TRESTRequest:是否可以在 POST 请求中使用自定义媒体类型?

    例如 我们有一个 API 需要我们自己的供应商特定内容类型application vnd xxxx custom custom data json但查看 REST Client 的源代码 它似乎总是默认为 REST Types 中的 Con
  • 如何使 TypeScript 输出有效的 ES6 模块导入语句?

    所有主流浏览器 http caniuse com feat es6 module支持 ES6 模块已有一段时间了 这些方法与许多服务器端方法的不同之处在于 它们需要指定要从中导入的确切文件 它们无法使用文件发现 这是有道理的 在 Node
  • 从 React Native 中的数组映射函数动态渲染内容

    我正在尝试从数组中获取数据并使用映射函数来呈现内容 看着 this lapsList 以及相关的 lapsList 函数来理解我想要做什么 结果是没有显示任何内容 视图下的视图等 这是我的简化代码 class StopWatch exten
  • 如何检查函数参数的类型?

    我有一个正在构建功能的应用程序 marshal and apply 它调用一些其他函数 或函子 f有一些论据 marshal and apply的工作是根据参数的类型对参数应用一些特殊的编组f的参数 如果其中之一f的参数是特殊类型 mars
  • 动态调整文本区域大小以适应内容

    这是我使用 netbeans 放入程序中的文本区域 第一张图片显示了我运行程序时文本区域的样子 第二张图片显示了我按下按钮后的文本区域 该按钮将大约 50 个 Hello world 字符串添加到文本区域 仅显示前 6 个 我需要动态增加文
  • 为什么位图图像在 Retina 显示屏上看起来很模糊?

    我没有视网膜设备 但我在网上看到了这个讨论 我读过有关为具有 Retina 显示屏的设备提供 2 倍图像尺寸的解决方案 以确保位图不会变得模糊 但是 我不明白这是如何工作的 首先 正如我所读到的 我假设视网膜显示器的像素密度是四倍 二的平方
  • 如何从 SQLAlchemy 引擎实例获取连接 URL?

    我通过生成一个程序来开始一个程序URL http docs sqlalchemy org en rel 1 0 core engines html highlight url sqlalchemy engine url URL对象并将其传递
  • NoMethodError:未定义的方法“调用”

    运行以下测试套件时 require spec helper describe User do before user User name Example User email email protected cdn cgi l email
  • 有没有办法一次重新编码多个变量?

    我有一个学生成绩单分数的数据集 范围从 D 到 A 我想将它们重新编码为 1 12 的范围 即 D 1 D 2 A 11 A 12 现在我正在起诉revalue函数于plyr 我有几列想要重新编码 有没有比运行更短的方法来做到这一点reva
  • 如何允许用户对列表中的项目重新排序?

    我有一个 Android 应用程序 用户可以在其中将项目添加到列表中 并且我希望他们能够按照自己的意愿对列表中的项目进行重新排序 而不是仅仅向他们提供不同的排序顺序 为项目添加位置设置 它们来自数据库 很容易 但是用户可以使用哪种 UI 元
  • 如何制作全屏java小程序?

    我正在用 Java 小程序设计一个心理学实验 我必须让我的 java 小程序全屏显示 执行此操作的最佳方法是什么以及我该如何执行此操作 由于我已经 3 年没有使用 java applet 我上次使用它是为了课程作业 我已经忘记了大部分概念
  • 如何在android sdk中从图库中获取图像并将其显示到屏幕上

    我想知道如何从图库中获取预先保存的图像 然后将其显示到屏幕上 任何教程 有用的链接和信息将不胜感激 如果您希望我进一步解释任何内容 请询问 Intent photoPickerIntent new Intent Intent ACTION
  • 使用 @abstractproperty 和 @abstractmethod 实现/覆盖的实际差异

    考虑一个抽象基类 它具有您希望每个后续子类重写的函数 使用 abc 模块和 ABCMeta 装饰有 abstractproperty or abstractmethod实际上强制子类 开发人员实现创建装饰器指定的函数类型 根据我的实验 您可