Tag: monkeypatching

在包装函数之前,我可以修补Python装饰器吗?

我有一个装饰器的function,我试图在Python 模拟库的帮助下进行testing。 我想使用mock.patch来replace真正的装饰器,只是调用函数的模拟“旁路”装饰器。 我无法弄清楚的是如何在真正的装饰器封装函数之前应用这个补丁。 我已经尝试了修补程序目标上的一些不同的变体,并重新sorting修补程序和导入语句,但没有成功。 有任何想法吗?

Monkey在Python的另一个模块中修补一个类

我正在使用其他人编写的模块。 我想猴子修补模块中定义的类的__init__方法。 我已经find的例子展示了如何做到这一点,都假设我自己会调用这个类(例如Monkey-patch Python类 )。 然而,这种情况并非如此。 在我的情况下,这个类在另一个模块的函数中初始化。 看下面的(大大简化的)例子: thirdpartymodule_a.py class SomeClass(object): def __init__(self): self.a = 42 def show(self): print self.a thirdpartymodule_b.py import thirdpartymodule_a def dosomething(): sc = thirdpartymodule_a.SomeClass() sc.show() mymodule.py import thirdpartymodule_b thirdpartymodule.dosomething() 有没有办法修改SomeClass的__init__方法,以便当从mymodule.py中调用dosomething时,例如打印43而不是42? 理想情况下,我可以包装现有的方法。 我无法更改第三方模块* .py文件,因为其他脚本依赖于现有的function。 我宁愿不必创build自己的模块副本,因为我需要做的更改非常简单。 编辑2013-10-24 我忽略了上面例子中的一个小而重要的细节。 SomeClass是像这样from thirdpartymodule_a import SomeClass : from thirdpartymodule_a import SomeClass 。 要做FJbuild议的补丁,我需要replacethirdpartymodule_b的副本,而不是thirdpartymodule_a 。 例如thirdpartymodule_b.SomeClass.__init__ = new_init […]

我可以将自定义的方法/属性添加到内置的Pythontypes吗?

例如,比方说,我想为Python的字典types添加一个helloWorld()方法。 我可以这样做吗? JavaScript有一个这样的原型对象。 也许这是不好的devise,我应该子类的字典对象,但它只能在子类上工作,我希望它在任何和所有未来的字典工作。 下面是在JavaScript中下载的方式: String.prototype.hello = function() { alert("Hello, " + this + "!"); } "Jed".hello() //alerts "Hello, Jed!" 这里有一个有用的链接更多的例子, http://www.javascriptkit.com/javatutors/proto3.shtml

在Rails中,如何为String类添加一个新的方法?

我想为我的Rails项目中的不同对象构build一个索引,并希望添加一个可以在String对象上调用的“count_occurences”方法。 我看到我可以做类似的事情 class String def self.count_occurences do_something_here end end 定义这个方法的确切方法是什么,在哪里把代码放在我的Rails项目中? 谢谢

Ruby的“修补”究竟意味着什么?

根据维基百科, 猴子补丁是: 在不改变原始源代码的情况下扩展或修改dynamic语言的运行时代码的一种方法。 以下来自同一条目的陈述使我困惑不解: 在Ruby中,“猴子补丁”一词被误解为对类的任何dynamic修改,常被用作在运行时dynamic修改任何类的同义词。 我想知道Ruby中的猴子修补的确切含义。 它做的是像下面这样的东西,还是其他的东西? class String def foo "foo" end end

一个猴子在python中如何修补一个函数?

我无法用另一个函数replace不同模块中的函数,这让我发疯。 比方说,我有一个模块bar.py,看起来像这样: from a_package.baz import do_something_expensive def a_function(): print do_something_expensive() 我有另一个模块,看起来像这样: from bar import a_function a_function() from a_package.baz import do_something_expensive do_something_expensive = lambda: 'Something really cheap.' a_function() import a_package.baz a_package.baz.do_something_expensive = lambda: 'Something really cheap.' a_function() 我希望能得到结果: Something expensive! Something really cheap. Something really cheap. 但是,我得到这个: Something expensive! Something expensive! Something expensive! 我究竟做错了什么?

如何dynamic添加属性到类中?

目标是创build一个类似db结果集的模拟类。 例如,如果一个数据库查询返回,使用一个字典expression式, {'ab':100, 'cd':200} ,那么我想看看: >>> dummy.ab 100 起初我想也许我可以这样做: ks = ['ab', 'cd'] vs = [12, 34] class C(dict): def __init__(self, ks, vs): for i, k in enumerate(ks): self[k] = vs[i] setattr(self, k, property(lambda x: vs[i], self.fn_readyonly)) def fn_readonly(self, v) raise "It is ready only" if __name__ == "__main__": c = C(ks, vs) print c.ab […]

Monkey-patch Python类

我有一个课,位于一个单独的模块,我不能改变。 from module import MyClass class ReplaceClass(object) … MyClass = ReplaceClass 这不会改变MyClass在其他地方,但这个文件。 但是,如果我会添加一个像这样的方法 def bar(): print 123 MyClass.foo = bar 这将工作,富方法将在其他地方提供。 我如何完全replace这个类?

你可以在Python的核心types猴子补丁方法?

Ruby可以将方法添加到Number类和其他核心types以获得如下效果: 1.should_equal(1) 但是,似乎python不能做到这一点。 这是真的? 如果是这样,为什么? 这是否与types无法修改的事实有关? 更新:而不是谈论猴子补丁的不同定义,我想只关注上面的例子。 我已经得出结论说,这是不可能的,因为你们中的一些人已经回答了。 但是我想要更详细地解释为什么它不能完成,也许什么function,如果在Python中可用,将允许这样做。 回答你们中的一些人:我可能想要这样做的原因只是美学/可读性。 item.price.should_equal(19.99) 阅读更像英文,并清楚地指出哪个是testing值,哪个是期望值,如下所示: should_equal(item.price,19.99) 这个概念是Rspec和其他一些Ruby框架的基础。

当猴子修补一个方法时,你可以从新的实现中调用重写的方法吗?

说我是猴子补丁在类中的方法,我怎么能从重写的方法调用重写的方法? 即有点像super 例如 class Foo def bar() "Hello" end end class Foo def bar() super() + " World" end end >> Foo.new.bar == "Hello World"