创建有序计数器

2023-12-06

我一直在阅读如何super()作品。我碰到这个食谱演示了如何创建有序计数器:

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first seen'
     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__,
                            OrderedDict(self))
     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)

例如:

oc = OrderedCounter('adddddbracadabra')

print(oc)

OrderedCounter(OrderedDict([('a', 5), ('d', 6), ('b', 2), ('r', 2), ('c', 1)]))

有人能解释一下这是如何神奇地工作的吗?

这也出现在Python 文档.


OrderedCounter 在中作为示例给出OrderedDict 文档,并且无需重写任何方法即可工作:

class OrderedCounter(Counter, OrderedDict):
    pass

当调用类方法时,Python 必须找到正确的方法来执行。它搜索类层次结构有一个定义的顺序,称为“方法解析顺序”或 mro。 mro 存储在属性中__mro__:

OrderedCounter.__mro__

(<class '__main__.OrderedCounter'>, <class 'collections.Counter'>, <class 'collections.OrderedDict'>, <class 'dict'>, <class 'object'>)

当 OrderedDict 的实例调用时__setitem__(),它按顺序搜索类:OrderedCounter, Counter, OrderedDict(在哪里找到的)。所以像这样的声明oc['a'] = 0最终打电话OrderedDict.__setitem__().

相比之下,__getitem__不被 MRO 中的任何子类覆盖,因此count = oc['a']由处理dict.__getitem__().

oc = OrderedCounter()    
oc['a'] = 1             # this call uses OrderedDict.__setitem__
count = oc['a']         # this call uses dict.__getitem__

对于类似这样的语句,会发生更有趣的调用序列oc.update('foobar'). First, Counter.update()被叫。代码为Counter.update()使用 self[elem],它会变成对OrderedDict.__setitem__()。和代码that calls dict.__setitem__().

如果基类颠倒,它就不再起作用。因为 mro 不同并且调用了错误的方法。

class OrderedCounter(OrderedDict, Counter):   # <<<== doesn't work
    pass

有关 mro 的更多信息可以在 Python 2.3 中找到文档.

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

创建有序计数器 的相关文章

随机推荐

  • XSLT 1.0 如何使用 sum() 对带有逗号的值求和 - 在 xpath 中行走

    我有一个 XSLT 1 0 转换要编写 但我没有在网上找到适合我的问题的良好解决方案 我有以下 XML 示例
  • 如何将参数从 JQuery 传递到 ASP.NET webmethod?

    我在下面编写了这个 jQuery ajax 方法 它调用 webmethod 除了作为 User 对象的参数具有空字段之外 调用发生得很好 当我调试时 我可以看到 firebug 中的值 但它们无法访问 webmethod 中的 User
  • C# 在其他线程上执行代码

    我的应用程序中的线程处理遇到一些问题 我有一个多线程客户端 服务器应用程序 我还使用 C MonoDevelop for Unity3d 不确定这对答案是否有任何影响 我将尝试解释我的问题出在哪里 Unity 在单线程上工作 所以如果我想实
  • 使用 NLTK 提取名词和动词

    我有 Django Rest 应用程序和一个模型任务 我对自然处理完全陌生 我想构建一个返回名词和动词列表的函数 它看起来像这样 api view GET def noun verb list request nouns verbs Lis
  • Groovy:Lombok @NoArgsConstructor 未创建默认构造函数

    我在用lombok 1 18 6在我的春季启动项目中 我有 NoArgsConstructor但仍然得到org springframework orm jpa JpaSystemException No default constructo
  • Android - Firestore/Firebase 实时数据库“.info/connected”返回错误的连接状态

    我在应用程序中使用 Firestore Beta 我想检查是否存在与 Firestore 数据库的有效在线连接 文档称 目前没有直接的方法来查询连接状态 但可以使用 Firebase 连接状态作为解决方法 代码片段也可以在文档的这一部分中找
  • AS/400:使用COMPUTE功能,不同字段定义结果不一致

    我在使用 AS 400 中的 COMPUTE 函数时遇到了一个神秘的问题 场景如下 01 WSAA AMOUNT A PIC S9 15 V9 02 COMP 3 01 WSAA AMOUNT B 01 PIC S9 16 V9 02 VA
  • 在 C++ 中创建文件夹

    我最近开始使用 C 工作 当我在执行代码时必须创建目录时遇到了这种情况 当我必须创建一个文件夹时 代码工作正常 但当我必须使用这个新创建的文件夹创建另一个文件夹时 代码会失败 假设 我在C 并想将我的文件存储在C A B 下面的代码使用mk
  • 使用 ncu (NsightComputeCli) 获取 nvprof 默认行为

    默认nvprof输出很棒 但是nvprof已被弃用 取而代之的是ncu 我怎样才能使ncu给我一个看起来更像的输出nvprof 最小工作示例 我有2个range以一种非常不理想的方式调用的函数 仅使用 1 个线程 比其他的需要更长的时间ra
  • 性能:子查询或连接

    我有一个关于子查询 连接另一个表的性能的小问题 INSERT INTO Original Person PID Name Surname SID SELECT ma PID new TBL Name ma Surname TBL SID F
  • 如何执行多个相继完成的 Alamofire 请求?

    我想执行多个 Alamofire 请求 但是 由于数据依赖性 新请求只能在前一个请求完成后才开始 我已经问过一个question一个更一般的异步请求示例 通过以下方法解决OperationQueue 然而 我并没有成功地用 Alamofir
  • fork()的执行顺序可以确定吗?

    我正在做教科书 操作系统概念第七版 的练习 我有点困惑如何fork 工作 据我了解 fork 创建一个与其父进程同时运行的子进程 但是 我们如何确切地知道哪个进程首先运行呢 我的意思是执行顺序 Problem使用以下命令编写 C 程序for
  • R CMD BATCH 或 Rscript 错误停止

    我不认为R CMD BATCH or Rscript应该在错误时停止 但我希望它停止 或类似的东西 作为一个例子 我有这个test R stop I really mean stop cat no I dont want this prin
  • 为 nth-child 和 nth-of-type 指定任意子级(无模式)列表

    所以我现在已经读了足够多的关于各种时髦的内容nth child and nth of type模式让第七个儿子的第七个儿子驾驶一艘宇宙飞船往返于冥王星 但我仍然没有找到一种方法来简单地以简洁的方式提供特定儿童的列表 它会像这样工作 td n
  • 判断SQLite数据库是否被锁定

    我读过关于如何检测 SQLite 数据库是否被锁定的其他答案 它建议使用sqlite3 busy handler sqlite3 busy timeout 我使用的是 Qt 它支持 SQLite 数据库 但这在这里并不重要 因为在我的应用程
  • MySQL注入查询

    我熟悉准备好的语句 并且我知道它们是防止 MySQL 注入的最佳实践 但我想知道这个 PHP MySQL 语句如何面临注入攻击的风险 result mysqli query db SELECT name FROM users WHERE i
  • Flash AS3 尝试获取外部 swf 时出现安全沙箱冲突

    嗨 我正在尝试从不同的服务器将 swf 文件加载到我的 Flash 应用程序 当我尝试将其加载到 flash IDE crl enter 上时 一切工作正常 但是当我将 swf 作为独立的 swf 文件运行或通过调试它时 我收到此错误 Se
  • 如何自定义像这样的按钮控件?

    我想制作一个像这样的自定义按钮控件 图像按钮可以 我是新用户 所以不能在这里发布图片 所以我上传了图片here 在尝试了一些教程后我现在有点绝望 任何建议都将受到高度赞赏 Thanks 更新于 08 10 2019 我很多年前就问过这个问题
  • 如何将xml元素绑定到对象成员变量中?

    我正在尝试使用 moxy 将 xml 解组为对象 下面是 xml 的示例
  • 创建有序计数器

    我一直在阅读如何super 作品 我碰到这个食谱演示了如何创建有序计数器 from collections import Counter OrderedDict class OrderedCounter Counter OrderedDic