如何动态覆盖__setitem__? (无子类)

2024-03-01

我无法覆盖某些内置函数,例如 '__setitem__',Python2.7(虽然我测试的之前版本也出现同样的情况)

虽然我知道这很容易通过子类化来完成,但这不是我想要的,我需要能够动态地重写这些方法。

显然,当我的班级是 ' 的子类时object',被重写的方法总是最终调用原始方法,但是当我的类不是 'object', 有用:

>>> def new_implementation(k, v):
...     print 'New implementation'
...

### class that extends object
>>> class ExtendsObject(object):
...     def __setitem__(self, k, v):
...             print 'ExtendsObject implementation'
...



### Checking implementation
>>> obj = ExtendsObject()
>>> obj[0]=0
ExtendsObject implementation

### trying to override setitem, no success
>>> obj.__setitem__ = new_implementation
>>> obj[0]=0
ExtendsObject implementation




### class that does NOT extends object
>>> class DoesNotExtend:
...     def __setitem__(self, k, v):
...             print 'DoesNotExtend implementation'
...

### Checking implementation
>>> obj_2 = DoesNotExtend()
>>> obj_2[0]=0
DoesNotExtend implementation

### overriding now works!
>>> obj_2.__setitem__ = new_implementation
>>> obj_2[0]=0
New implementation

由于某种原因,对象似乎对这些内置函数使用了一些不同的方法解析顺序。

这是一个错误吗?难道我做错了什么?


对于旧式类,每次需要时都会在实例上查找特殊方法。新式类只查找特殊方法type实例的字典,而不是实例的字典本身 - 这就是您看到您所看到的行为的原因。

(如果你不知道——新式类是直接或间接派生自object.)

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

如何动态覆盖__setitem__? (无子类) 的相关文章

随机推荐

  • Chrome/Webkit 中的 CSS 动画/缩放问题

    此效果在 FF 中运行良好 但在 Chrome 中则不然 Chrome 中的 Firebug 结果显示 webkit animation 未在 Chrome 中呈现 然而 在 Firefox 中 您会在对象入口处看到 拉伸 效果 在 Chr
  • 使用 ICS 更改 wifi 网络时,ErrnoException:isConnected 失败:EHOSTUNREACH(没有到主机的路由)

    在 ics 上使用我的应用程序时 将 wifi 网络从网络更改为网络后 所有图像请求都开始返回 但出现异常 异常失败 gt org apache http conn HttpHostConnectException Connection t
  • 使用 Scanner 的 nextLine() 和 hasNextLine() 方法时出现问题

    我有一个包含以下数据的日志文件 最短路径 2 RV3280 RV0973C RV2888C最短路径 1 RV3280 RV2502C最短路径 2 RV3280 RV2501C RV1263最短路径 2 RV2363 Rv3285 RV328
  • Windows 服务如何以标准时间间隔启动应用程序?

    顾问设置 Windows 服务来运行应用程序 该应用程序应该每 15 分钟运行一次 该应用程序根本没有运行 并且服务似乎运行良好 我不熟悉应用程序作为服务运行时如何以标准间隔运行 该服务使用 SRVANY EXE 工具 任何使用 SRVAN
  • mysql删除重复数据

    这向我显示了所有具有完全相同的两个条目的名字和姓氏 SELECT firstname lastname COUNT AS Count FROM people GROUP BY firstname lastname HAVING Count
  • 尝试运行 Strapi 会出现模块解析错误

    我正在尝试通过 Ubuntu 20 04 上的 npm 使用 npm rundevelop 运行一个 Strapi 项目 该代码来自我的一个小组项目 没有其他人遇到这些问题 Error cache plugins strapi plugin
  • 带有 goto 命令的 Windows 批处理文件不起作用

    我对 GOTO 命令和附属标签有疑问 事实 给定文件夹中的一堆文件 它们是日志错误 我需要打开它们并检查它们是否包含特定字符串 如果是 则从文件名中删除一些字符 最后一次出现 之后的所有字符 包括其本身 并执行其他操作 为了切断字符 我以循
  • F# 缺少类型约束

    在以下代码中 请注意 get Zero 的类型约束 type Wrapper lt t gt Data t let compute lt t when t static member get Zero unit gt t and t sta
  • nodejs Route.get() 需要回调函数但得到一个 [object String]

    我开始使用带有express的nodejs进行编码 所以我在我的文件 test js 中执行了此操作 该文件位于我的文件夹中 const express require express const router new express Ro
  • 每组查询的前 3 个值 MS Access

    我是 MS Access 的新手 我正在尝试进行一个查询 该查询将根据分数提取 3 个不同类别中的前 3 名人员 即期望的结果是 Child s name Membership Type Total Points Jon Snow Seni
  • 无法在特定 div 上滚动来触发 jquery 函数

    简短版本 这有效 document on click Container function 这不会 document on scroll Container function 长版 很抱歉 发布代码片段是不可行的 因为它是一个复杂的类似应用
  • 类中的部分评估类型

    这是我提出的问题的具体版本here https stackoverflow com questions 60072003 reordering type parameters in haskell 我有一个算法 可以产生一些输出 并且可以产
  • 使用鼠标选择要捕获的区域

    我正在制作一个基于Java的屏幕截图应用程序 当您按下键盘上的组合键时 我想这样做这个视频 http www youtube com watch v bJ6VbbpQ0XY发生在您在屏幕上选择区域的位置 并且它会拍摄所选区域的屏幕截图 如何
  • Google 搜索查询中参数的含义? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有关于 Google 查询中的参数含义的资源 有没有分析过 Google 搜索页面的内部运作方式 例子是 http www googl
  • 如何使用eclipse进行C#开发? [复制]

    这个问题在这里已经有答案了 可以使用eclipse进行C 开发吗 如果可以的话 该怎么办呢 您最喜欢的组合是什么 虽然我见过一些半成品的插件 但我不相信有任何东西可以做到这一点close到 Eclipse 中的 Java 工具 如果您使用的
  • 使用 jquery-1.4.1.js 访问被拒绝

    我正在使用 VS2010 和 jquery 1 4 1 js 版本 我尝试访问 WCF 服务 但出现奇怪的错误 访问被拒绝 in jquery 1 4 1 js在页码处4982 jquery 1 4 1 js Open the socket
  • 清除控制台缓冲区

    我正在 VS2008 中编写一个示例控制台应用程序 现在我有一个Console WriteLine 在屏幕上显示输出的方法 然后有Console ReadKey 等待用户结束应用程序 If I press Enter while the C
  • 如何从服务类调用组件方法 - Angular

    我试图从服务类调用组件方法 但收到类似 错误类型错误 无法读取未定义的属性 测试 的错误 但是我遇到了类似的问题 但主要解释了组件到组件的调用 所以我没有正确理解 例子 测试组件 ts Component selector componen
  • 考虑到指令具有不同的长度,CPU 如何知道下一条指令应该读取多少字节?

    所以我正在读一篇论文 其中他们说静态反汇编二进制代码是不可判定的 因为一系列字节可以用多种可能的方式表示 如图所示 其 x86 所以我的问题是 那么CPU是如何执行这个的呢 例如 在图中 当我们到达 C3 之后时 它如何知道下一条指令应该读
  • 如何动态覆盖__setitem__? (无子类)

    我无法覆盖某些内置函数 例如 setitem Python2 7 虽然我测试的之前版本也出现同样的情况 虽然我知道这很容易通过子类化来完成 但这不是我想要的 我需要能够动态地重写这些方法 显然 当我的班级是 的子类时object 被重写的方