你能在 Python 的核心类型上猴子修补方法吗?

新手上路,请多包涵

Ruby 可以向 Number 类和其他核心类型添加方法来获得如下效果:

 1.should_equal(1)

但似乎 Python 无法做到这一点。这是真的?如果是这样,为什么?跟不能修改 类型 有关系吗?

我不想谈论猴子补丁的不同定义,而是只想关注上面的例子。正如你们中的一些人所回答的那样,我已经得出结论,这是不能做到的。但我想要更详细的解释为什么它不能完成,如果在 Python 中可用的话,也许什么功能允许这样做。

回答你们中的一些人:我 可能 想这样做的原因仅仅是美观/可读性。

  item.price.should_equal(19.99)

这读起来更像英文,并且清楚地表明哪个是测试值,哪个是期望值,应该是:

 should_equal(item.price, 19.99)

这个概念是 Rspec 和其他一些 Ruby 框架所基于的。

原文由 airportyh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 515
2 个回答

这里的 Monkey Patch 到底是什么意思?有 几个略有不同的定义

如果你的意思是,“你能在运行时改变一个类的方法吗?”,那么答案是肯定的:

 class Foo:
  pass # dummy class

Foo.bar = lambda self: 42

x = Foo()
print x.bar()

如果您的意思是,“您能否在运行时更改类的方法 并使该类的所有实例事后更改?”那么答案也是肯定的。稍微改变一下顺序:

 class Foo:
  pass # dummy class

x = Foo()

Foo.bar = lambda self: 42

print x.bar()

但是您不能对某些内置类执行此操作,例如 intfloat 。这些类的方法是用 C 实现的,为了使实现更容易、更高效,牺牲了某些抽象。

我不太清楚您 为什么 要改变内置数字类的行为。如果您需要改变它们的行为,请将它们子类化!!

原文由 Dan Lenski 发布,翻译遵循 CC BY-SA 2.5 许可协议

你不能。在 Python 中,在 C 扩展模块(包括内置函数)中定义的所有数据(类、方法、函数等)都是不可变的。这是因为 C 模块在同一进程中的多个解释器之间共享,因此对它们进行 monkeypatching 也会影响同一进程中不相关的解释器。 (通过 C API 可以在同一进程中使用多个解释器,并且已经做出 一些努力 使它们在 Python 级别可用。)

但是,Python 代码中定义的类可能会被猴子修补,因为它们对于该解释器来说是本地的。

原文由 John Millikin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题