Questions tagged «monkeypatching»




24
如何动态地向类添加属性?
目标是创建一个行为类似db结果集的模拟类。 因此,例如,如果数据库查询使用dict表达式返回{'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, …

9
我可以在包装函数之前修补Python装饰器吗?
我有一个带有装饰器的函数,我正在Python Mock库的帮助下进行测试。我想mock.patch用一个仅调用函数的模拟“ bypass”装饰器代替真正的装饰器。 我不知道的是如何在真正的装饰器包装功能之前应用补丁。我在补丁目标上尝试了几种不同的变体,并对补丁和导入语句重新排序,但均未成功。有任何想法吗?

5
一只猴子如何修补python中的功能?
我在用另一个功能替换另一个模块中的功能时遇到麻烦,这让我发疯。 假设我有一个看起来像这样的模块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! …

6
猴子在Python的另一个模块中修补类
我正在使用其他人编写的模块。我想猴子修补__init__模块中定义的类的方法。我发现的示例显示了如何执行此操作的所有示例,都假设我自己将自己称为该类(例如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_b.dosomething() 有什么方法可以修改的__init__方法,例如,SomeClass当dosomething从mymodule.py调用该方法时,它显示43而不是42?理想情况下,我将能够包装现有方法。 我不能更改thirdpartymodule * .py文件,因为其他脚本取决于现有功能。我宁愿不必创建自己的模块副本,因为我需要进行的更改非常简单。 编辑2013-10-24 在上面的示例中,我忽略了一个很小但很重要的细节。SomeClass是这样导入的thirdpartymodule_b:from thirdpartymodule_a import SomeClass。 要执行FJ建议的补丁,我需要替换其中的副本thirdpartymodule_b,而不是thirdpartymodule_a。例如thirdpartymodule_b.SomeClass.__init__ = new_init。

7
我可以将自定义方法/属性添加到内置Python类型吗?
例如,例如我想helloWorld()向Python的dict类型添加一个方法。我可以这样做吗? JavaScript具有这种行为的原型对象。也许这是错误的设计,我应该将dict对象子类化,但随后它只能在子类上工作,而我希望它在将来的所有字典中都可以使用。 这是在JavaScript中的用法: String.prototype.hello = function() { alert("Hello, " + this + "!"); } "Jed".hello() //alerts "Hello, Jed!" 这是带有更多示例的有用链接-http ://www.javascriptkit.com/javatutors/proto3.shtml
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.