小编典典

您可以在Python的核心类型上使用猴子补丁方法吗?

python

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

1.should_equal(1)

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

更新:我不想谈论猴子修补的不同定义,而是仅关注上面的示例。
我已经得出结论,这不可能完成,因为你们中的一些人已经回答了。但是,我想更详细地解释为什么它不能完成,也许有什么功能(如果在Python中可用)可以做到这一点。

回答一些问题:我 可能 要这样做的原因仅仅是美观/可读性。

 item.price.should_equal(19.99)

读起来更像英语,并清楚地表明哪个是测试值,哪个是期望值,如:

should_equal(item.price, 19.99)

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


阅读 229

收藏
2020-12-20

共1个答案

小编典典

您在这里所说的猴子补丁到底是什么意思?有几个略有不同的定义

如果您的意思是“您可以在运行时更改类的方法吗?”,那么答案很明显是:

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()

但是您不能对某些内置类(例如int或)执行此操作float。这些类的方法在C中实现,并且为了使实现更容易,更有效而牺牲了某些抽象。

我不清楚您 为什么 仍要更改内置数字类的行为。如果您需要更改其行为,请对其进行子类化!!

2020-12-20