Ruby可以向Number类和其他核心类型添加方法以获得如下效果:
1.should_equal(1)
但是似乎Python无法做到这一点。这是真的?如果是这样,为什么?它与不能修改 类型有关 吗?
更新:我不想谈论猴子修补的不同定义,而是仅关注上面的示例。 我已经得出结论,这不可能完成,因为你们中的一些人已经回答了。但是,我想更详细地解释为什么它不能完成,也许有什么功能(如果在Python中可用)可以做到这一点。
回答一些问题:我 可能 要这样做的原因仅仅是美观/可读性。
item.price.should_equal(19.99)
读起来更像英语,并清楚地表明哪个是测试值,哪个是期望值,如:
should_equal(item.price, 19.99)
这个概念是Rspec和其他一些Ruby框架所基于的。
您在这里所说的猴子补丁到底是什么意思?有几个略有不同的定义。
如果您的意思是“您可以在运行时更改类的方法吗?”,那么答案很明显是:
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中实现,并且为了使实现更容易,更有效而牺牲了某些抽象。
int
float
我不清楚您 为什么 仍要更改内置数字类的行为。如果您需要更改其行为,请对其进行子类化!!