子模块对 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 = IN2
和 module1.IN = IN2
在这种情况下的根本区别是什么。
我是 相关 post。
from module import IN
创建一个引用 module.IN
的局部变量; module.IN
和 IN
是对同一个 class 的两个独立引用。 IN = IN2
更改了本地引用,但 module.IN
(由 module.C
使用)继续引用相同的 class.
更新
在您的编辑中,module1.IN
是 module1
命名空间中的全局变量,最初 引用 到 [=19] 中的 class =],但与 module
命名空间中的全局 in_mod.IN
不同。更改其值根本不会影响 in_mod
。无法通过 module1
直接访问 in_mod
的命名空间,因为您没有导入整个模块,只是模块中的一个值。
我有三个模块:
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 = IN2
和 module1.IN = IN2
在这种情况下的根本区别是什么。
我是
from module import IN
创建一个引用 module.IN
的局部变量; module.IN
和 IN
是对同一个 class 的两个独立引用。 IN = IN2
更改了本地引用,但 module.IN
(由 module.C
使用)继续引用相同的 class.
更新
在您的编辑中,module1.IN
是 module1
命名空间中的全局变量,最初 引用 到 [=19] 中的 class =],但与 module
命名空间中的全局 in_mod.IN
不同。更改其值根本不会影响 in_mod
。无法通过 module1
直接访问 in_mod
的命名空间,因为您没有导入整个模块,只是模块中的一个值。