有人能解释一下这背后的逻辑是如何与 Python 解释器一起工作的吗?这种行为只是线程本地的吗?为什么第一个模块导入中的分配在第二个模块导入后仍然存在?我刚刚进行了长时间的调试,结果就是这样。
external_library.py
def the_best():
print "The best!"
modify_external_library.py
import external_library
def the_best_2():
print "The best 2!"
external_library.the_best = the_best_2
main.py
import modify_external_library
import external_library
external_library.the_best()
测试:
$ python main.py
The best 2!
最佳答案
与此无关。 somemodule.anattr = avalue
是非常的全局行为!在这个赋值之后,无论如何都会改变属性(直到以后可能改回)。
游戏中没有神秘的机制!对允许此类赋值的对象的任何属性的赋值(如模块对象所做的那样)只是以明显的方式工作——没有线程局部的任何东西,没有什么奇怪的——并且对属性的赋值持续存在,只要你的属性的对象是当然,我们已经分配了 persists。
重复的 import external_library
不会reload 模块(reload
是一个完全独立的内置和 import
不调用它!)——它只是检查sys.modules
,在那个dict
中找到一个external_library
键,并将相应的值(之前已被该赋值修改)绑定(bind)到适当命名空间(此处为模块 main
的全局变量)中的名称 external_library
。
关于python - 在这种情况下允许 Python monkey patching 的机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185455/