![]() |
1
39
你说的猴子补丁到底是什么意思?有 several slightly different definitions . 如果您的意思是,“您能在运行时更改类的方法吗?”,那么答案是肯定的:
如果你的意思是,“你能在运行时改变类的方法吗? 在事实发生后更改该类的所有实例 “那么答案也是肯定的。稍微改变一下顺序:
但是你不能为某些内置类这样做,比如
我不太清楚 为什么? 您无论如何都希望更改内置数值类的行为。如果你需要改变他们的行为,把他们分成子类!! |
![]() |
2
65
不,你不能。在Python中,C扩展模块(包括内置模块)中定义的所有数据(类、方法、函数等)都是不可变的。这是因为C模块在同一进程中在多个口译员之间共享,所以MonkeyPatching它们也会影响同一进程中不相关的口译员。(同一进程中的多个口译员可以通过 C API 而且 some effort 使它们在Python级别上可用。) 但是,在Python代码中定义的类可能是monkeyPatched,因为它们是该解释器的本地类。 |
![]() |
3
28
玩得开心; |
![]() |
4
22
你可以这样做,但这需要一点黑客。幸运的是,有一个模块现在被称为“禁果”,它让您能够非常简单地修补内置类型的方法。你可以在 http://clarete.github.io/forbiddenfruit/?goback=.gde_50788_member_228887816 或 https://pypi.python.org/pypi/forbiddenfruit/0.1.0 对于最初的问题示例,在编写了“should_equal”函数之后,您只需
你真是太好了!还有一个“reverse”函数可以删除修补后的方法。 |
![]() |
5
13
正如其他用户指出的那样,python的核心类型在设计上是不变的:
你当然 能够 通过创建子类来实现您描述的效果,因为默认情况下,Python中的用户定义类型是可变的。
没有必要做
当然,在某些情况下,能够熟练使用习惯用法的Python程序员会认为这种子类化方法是正确的。例如,
也就是说,在您给出的具体示例中,我不相信子类化
或者沿着这些线。它有点冗长,但毫无疑问它可以改进。与Ruby风格的猴子修补相比,这种方法的一个可能优势是
|
![]() |
6
7
不能在Python中修补核心类型。 但是,您可以使用pipe编写更具人类可读性的代码:
|
![]() |
7
4
下面是一个实现
|
![]() |
8
3
如果你真的 真的? 想要在python中做一个monkey补丁,可以使用“import foo as bar”技术进行一次(排序)黑客攻击。 如果您有一个类,比如telnetconnection,并且您想要扩展它,那么可以在一个单独的文件中对它进行子类化,并将其称为类似telnetconnectionextended的类。 然后,在代码顶部,您通常会说:
将其更改为:
然后,您引用telnetconnection的代码中的任何地方实际上都将引用telnetconnectionextended。 遗憾的是,这假定您可以访问该类,“a s”只在该特定文件中运行(它不是全局重命名),但我发现它有时很有用。 |
![]() |
9
2
不,但您有userdict userstring和userlist,它们都是基于这一点创建的。 如果你谷歌,你会发现其他类型的例子,但这是内置的。 一般来说,monkey补丁在python中的使用要比在ruby中少。 |
![]() |
10
2
不,遗憾的是您不能在运行时扩展在C中实现的类型。
您可以将int子类化,尽管它非常重要,但是您可能需要重写
您还存在语法问题:
然而
|
![]() |
11
1
不,在Python中不能这样做。我认为这是件好事。 |
|
12
1
什么?
没有考虑到味道,但是没有一个普通的Python开发人员会说它比您的版本更不可读。
做
或者:
并在项的类或超类上定义适当的方法。 |
![]() |
13
1
看来你真正想写的是:
(当然,比较浮点数是否相等,或者使用浮点数表示价格)是
a bad idea
,所以你要写
您也可以使用类似的测试框架 py.test 以获取有关测试中失败断言的更多信息。 |
![]() |
14
0
以下是我如何实现的。应该做些什么…行为:
或
我包括一个decorator方法,用于在运行时在独立方法上扩展此行为:
你必须对内部有点了解,但它是有效的。 资料来源如下: https://github.com/mdwhatcott/pyspecs 它也在Pypi上的Pypecs下。 |