当前位置: 首页 > 面试题库 >

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

束帅
2023-03-14
问题内容

我正在使用其他人编写的模块。我想猴子修补__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__方法,例如,SomeClassdosomething从mymodule.py调用该方法时,它显示43而不是42?理想情况下,我将能够包装现有方法。

我不能更改thirdpartymodule * .py文件,因为其他脚本取决于现有功能。我宁愿不必创建自己的模块副本,因为我需要进行的更改非常简单。

编辑2013-10-24

在上面的示例中,我忽略了一个很小但很重要的细节。SomeClass是这样导入的thirdpartymodule_bfrom thirdpartymodule_a import SomeClass

要执行FJ建议的补丁,我需要替换中的副本thirdpartymodule_b,而不是thirdpartymodule_a。例如thirdpartymodule_b.SomeClass.__init__= new_init


问题答案:

以下应该工作:

import thirdpartymodule_a
import thirdpartymodule_b

def new_init(self):
    self.a = 43

thirdpartymodule_a.SomeClass.__init__ = new_init

thirdpartymodule_b.dosomething()

如果要新的init调用旧的init,则将new_init()定义替换为以下内容:

old_init = thirdpartymodule_a.SomeClass.__init__
def new_init(self, *k, **kw):
    old_init(self, *k, **kw)
    self.a = 43


 类似资料:
  • 问题内容: 我知道,如果go代码的结构使其可以编程为接口,那么模拟起来就很简单了。但是,我正在使用无法更改的代码库(不是我的),情况并非如此。 该代码库是高度互连的,并且仅对结构进行编程,而没有对接口进行编程,因此没有依赖项注入。 这些结构本身仅包含其他结构,因此我也无法以这种方式进行模拟。我不相信我可以对方法做任何事情,并且存在的少数几个函数不是变量,所以我不知道如何将它们换出。继承在golan

  • 问题内容: 我在用另一个功能替换另一个模块中的功能时遇到麻烦,这让我发疯。 假设我有一个看起来像这样的模块bar.py: 我还有另一个看起来像这样的模块: 我希望得到结果: 但是我得到了这个: 我究竟做错了什么? 问题答案: 考虑一下Python名称空间的工作原理可能会有所帮助:它们实际上是字典。因此,当您执行此操作时: 这样想: 希望您能明白为什么它不起作用:-)将名称导入名称空间后, 从中 导

  • 问题内容: 我遇到了有关monkey修补Django的帖子: 我知道这不是理想的选择,最好User通过单独的模型添加字段和函数Profile。 话虽如此,我只想了解这是如何工作的: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会syncdb“知道”是否已添加新字段吗?如果没有

  • 本文向大家介绍python 猴子补丁(monkey patch),包括了python 猴子补丁(monkey patch)的使用技巧和注意事项,需要的朋友参考一下 写了一段时间java切回写python偶尔会出现一些小麻烦,比如:在java中自定义对象变成json串很简单,调用一个方法就行,但同样的转换在python中却不太容易实现。在寻找python自定义对象转json串的过程中,接触到了猴子补

  • 问题内容: 我试图使用Dagger在正在构建的应用程序上进行依赖注入,当我拥有一个程序包的模块(取决于注入器(可能是另一个模块)提供的值)时,在构造适当的DAG时遇到了麻烦。 如果我有一个用于配置变量的简单模块(例如,我可能想换成测试环境) 而另一个模块依赖于它,例如 我尝试在构造函数中引导注入的行失败,并且它抱怨我没有在适当的模块中指定显式行。 通过反复试验,我发现如果在行中添加,这种情况就消失

  • 我对python还很陌生,所以如果这是非常简单或非常错误的思考方式,请原谅我。 我安装了python 2.7。根据我在运行以下代码时的理解,它列出了查找模块的目录。 我有另一个目录,似乎有一堆我安装的 python 模块。“/Library/Python/2.7/site-packages” 我想我需要做两件事之一: (1) 指示python在这个附加文件夹中查找模块。我该怎么做? (2)将模块安