【问题标题】:Effect of Submodules on Monkeypatching of Classes in Python子模块对 Python 中类的 Monkeypatching 的影响
【发布时间】:2016-06-20 22:47:00
【问题描述】:

我有三个模块:

in_mod.py

class IN(object):
    def __init__(self):
        print("i am the original IN")

module1.py

from in_mod import IN
class C(object):
    def __init__(self):
        cl = IN()

module2.py

from module1 import C
class IN2(object):
    def __init__(self):
        print("I am the new IN")

C()

import in_mod
in_mod.IN = IN2
C()

import module1
module1.IN = IN2
C()

当我使用module1.IN = IN2 时,我得到了猴子修补IN 类并用IN2 类替换它的期望行为。

我想了解in_mod.IN = IN2module1.IN = IN2 在这种情况下的根本区别。

我是referencing 相关帖子。

【问题讨论】:

  • IN = IN2 shadows module2 中的导入版本,但实际上并没有改变 module1module1 中的任何功能仍然可以看到以前的版本。您实际上要修补什么,为什么(例如为了测试)?
  • 在第一个示例中,C2 继承自 module1.c,但在第二个示例中,您从 module1 导入 C2,但从 C 继承 - 我不确定为什么。您能否详细说明一下您的“预期行为”是什么?为什么?
  • 是的,这是为了测试。我正在尝试用 IN2 模拟 IN。我正在尝试使用from .. import 测试导入的模块,但我无法更改它。

标签: python class inheritance monkeypatching


【解决方案1】:

from module import IN 创建一个引用module.IN 的局部变量; module.ININ 是对同一类的两个独立引用。 IN = IN2 更改了本地引用,但 module.IN(由 module.C 使用)继续引用同一个类。


更新

在您的编辑中,module1.INmodule1 命名空间中的全局变量,最初引用 in_mod 中的类,但不同于 @ 中的全局 in_mod.IN 987654333@ 命名空间。更改其值根本不会影响in_mod。无法通过module1 直接访问in_mod 的命名空间,因为您不会导入整个模块,只导入模块中的一个值。

【讨论】:

  • 好的,谢谢。我认为这是我需要的理解。下一个问题是如何更改 module.C 使用的引用
  • 这就是您在第一个示例中所做的:直接分配给module.IN
  • 好的,我已经对问题中的代码进行了很多重构,希望使它更清晰,更接近我的应用程序中的内容。我想我现在有一些东西可以工作,但我仍然不确定我是否完全理解为什么。你能看看吗?谢谢
  • 好的,谢谢。这对我来说很有意义,并且适用于我的应用程序。 This SO post 也很好地解释了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多