子模块对 Python 中 类 的 Monkeypatching 的影响

Effect of Submodules on Monkeypatching of Classes in Python

我有三个模块:

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 class 并将其替换为 IN2 class 的行为。

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

我是 相关 post。

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


更新

在您的编辑中,module1.INmodule1 命名空间中的全局变量,最初 引用 到 [=19] 中的 class =],但与 module 命名空间中的全局 in_mod.IN 不同。更改其值根本不会影响 in_mod。无法通过 module1 直接访问 in_mod 的命名空间,因为您没有导入整个模块,只是模块中的一个值。