Python ABC:注册与子类化

2024-01-09

(我使用的是 python 2.7)python 文档表明您可以将映射传递给内置的 dict,它将将该映射复制到新的 dict 中:

http://docs.python.org/library/stdtypes.html#mapping-types-dict http://docs.python.org/library/stdtypes.html#mapping-types-dict

我有一个实现映射 ABC 的类,但它失败了:

import collections
class Mapping(object):
    def __init__(self, dict={}): self.dict=dict
    def __iter__(self): return iter(self.dict)
    def __iter__(self): return iter(self.dict)
    def __len__(self): return len(self.dict)
    def __contains__(self, value): return value in self.dict
    def __getitem__(self, name): return self.dict[name]

m=Mapping({5:5})
dict(m)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
collections.Mapping.register(Mapping)
dict(m)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence

但是,如果我的类是 collections.Mapping 的子类,那么它就可以正常工作:

import collections
class Mapping(collections.Mapping):
    def __init__(self, dict={}): self.dict=dict
    def __iter__(self): return iter(self.dict)
    def __iter__(self): return iter(self.dict)
    def __len__(self): return len(self.dict)
    def __contains__(self, value): return value in self.dict
    def __getitem__(self, name): return self.dict[name]

m=Mapping({5:5})
dict(m)
# {5: 5}

我认为 ABC 的全部要点是允许注册与子类化相同(无论如何对于 isinstance 和 issubclass)。那么这是怎么回事?


注册不会为您提供在您定义的方法之上实现的“缺失方法”:事实上,注册是非侵入性对于您正在注册的类型——没有添加任何内容,没有删除任何内容,也没有更改任何内容。它only影响isinstance and issubclass检查:不多也不少。

除了您必须自己定义的方法之外,对 ABC 进行子类化可以而且确实为您提供了由 ABC “免费”实现的大量方法。

与注册操作相比,完全非侵入性的操作的语义intended丰富一个类,就像子类化一样,显然不能是相同的;所以你对“ABC 的全部要点”的理解是不完美的——ABC 已经two点,一是通过子类化(“侵入性”)获得的,一是通过注册(非侵入性)获得的。

请注意,如果您已经拥有像原始类一样的类,则始终可以进行多重继承Mapping: class GoogMapping(Mapping, collections.Mapping): ...会给你与继承相同的结果Mapping直接来自collections.Mapping——一种新类型with添加的所有辅助方法collections.Mapping.

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

Python ABC:注册与子类化 的相关文章

随机推荐

  • MVP模式(GWT)的优点是什么

    我刚刚读过本文 http code google com intl de DE webtoolkit doc latest DevGuideMvpActivitiesAndPlaces html这确实让我很困惑 其次 此模型允许我们最大限度
  • 什么是控制器类? [复制]

    这个问题在这里已经有答案了 什么是控制器类 例如 uiviewcontroller uiviewcontroller 和 uiview 有什么区别 谢谢 Cocoa 使用面向对象编程中的模型 控制器 视图概念进行工作 在此系统中 模型由存储
  • 如何获取 NameValueSectionHandler 类型的 ConfigurationSection 的值

    我正在使用 C Framework 3 5 VS 2008 我正在使用ConfigurationManager将配置 不是默认的 app config 文件 加载到 Configuration 对象中 使用 Configuration 类
  • 解析 SDK 1.7.1 无法在 Xcode 6.3 中工作

    我的代码在 Xcode 6 2 中运行良好 更新到 Xcode 6 3 后 我遇到了一些 Nullabilty 错误 下载 Parse SDK 1 7 1 后 我可以解决这些错误 所以我删除了项目中旧的 Parse 框架文件并将新的粘贴到其
  • 将浮点数转换为无符号整数,同时保留顺序

    我找到了很多关于 SO 的答案 专注于转换float to int 我只处理正浮点值 我一直在使用的一种简单方法是 unsigned int float2ui float arg0 float f arg0 unsigned int r u
  • 设计 RESTful 登录服务

    我经历过类似的问题here https stackoverflow com questions 4608225 how do i implement login in a restful web service 但我还不清楚概念 这是我的场
  • Spark 使用数据局部性吗?

    我正在尝试了解 Apache Spark 的内部结构 我想知道 Spark 是否使用某些机制来确保从 InputFormat 读取或写入 OutputFormat 或 Spark 本机支持的其他格式而不是从 MapReduce 派生的格式
  • System.NotSupportedException - 无法比较“System.Linq.IQueryable”类型的元素

    我目前收到以下错误 gt EntityFramework SqlServer dll 中发生 System NotSupportedException 类型的异常 但未在用户代码中处理 其他信息 无法比较 System Linq IQuer
  • python selenium 将密钥发送到只读文本框

    我正在尝试使用下面的 python selenium 代码将密钥发送到下面的字段
  • 单行删除重复项,保持列表的排序[重复]

    这个问题在这里已经有答案了 我有以下清单 Herb Alec Herb Don 我想在保持顺序的同时删除重复项 所以它是 Herb Alec Don 以下是我详细地执行此操作的方法 l new for item in l old if it
  • 如何在 r2dbc 中连接表?

    在java反应器中 r2dbc 我有两个表 A B 我还为它们定义了存储库 如何获取A连接B组成的数据 我只提出以下方法 从 A 调用databaseClient select 然后在循环中从 B 调用 select 但我想要更有效和反应性
  • 如何将浮点数转换为字符串而不考虑区域设置?

    我的产品面向葡萄牙受众 其中逗号是小数点符号 我通常使用 CString Format 将数字输入字符串 它会考虑计算机的区域设置 虽然总的来说这是一个很好的方法 但我在格式化 SQL 查询时遇到了问题 例如 CString szInser
  • PL/Python 和 postgreSQL:返回多列表的最佳方法是什么?

    在 Pl Python 中 RETURNS setof 或 RETURNS table 子句用于返回类似结构化数据的表 在我看来 必须提供每一列的名称才能返回表 如果您有一个包含几列的表格 那么这很容易 但是 如果您有一个包含 200 列的
  • 如何将多列连接成单列(事先不知道其数量)?

    假设我有以下数据框 agentName original dt parsed dt user text qwertyuiop 0 0 16102 0 0 我希望创建一个新的数据框 其中多一列 该列连接了该行的所有元素 agentName o
  • 用 python 求解超越方程组

    假设我有以下四个方程 cos x x a 余弦 y y b a b 1 c sinc x d sinc y 对于未知变量x y a and b 注意cos x x a有多种解决方案 变量也类似y 我只感兴趣x and y值 首先是正根 如果
  • CSS“框架”可以解释浏览器的异常情况吗?

    我为一家小型媒体公司建立网站 不幸的是 我们大约 45 50 的客户群使用 IE6 而另一半则几乎均等地使用 Firefox 和基于 Webkit 的浏览器 还有少数 Opera 用户 我的每一个网站都使用类似于 Eric Meyer 的重
  • 如何从多个嵌套if条件调用json

    我正在使用 CodeIgniter 我正在研究一个小项目 它是一个批次列表 现在 如果管理员想要创建批次列表 那么应该输入开始日期和结束日期以及开始时间和结束时间 然后它将在数据库中检查批次是否在相同的日期和时间运行 如果是 那么它将显示该
  • Ruby regexp:捕获url的路径

    我想从任何 URL 中提取其路径 例如 URL https stackoverflow com questions ask https stackoverflow com questions ask路径 问题 提问 这应该不难 url w
  • 场景中有多个反射器:如何实现clone()函数?

    我需要大约 80 移动 反射ShapeBufferGeometry在一个场景中 我希望他们分享尽可能多的材料数据 显然 clone 该方法不适用于Reflector 我得到的黑色几何图形不反射任何东西 尝试添加一个clone 方法到prot
  • Python ABC:注册与子类化

    我使用的是 python 2 7 python 文档表明您可以将映射传递给内置的 dict 它将将该映射复制到新的 dict 中 http docs python org library stdtypes html mapping type