python - 在这种情况下允许 Python monkey patching 的机制是什么?

标签 python global-variables monkeypatching python-internals side-effects

有人能解释一下这背后的逻辑是如何与 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/

相关文章:

matlab - 从主函数中清除局部函数中的持久变量

javascript - 在自执行匿名函数中使用 undefined

python - 是否可以使用装饰器来猴子修补全局变量?

c# - 使用 IronPython 和 .Net 的鼠标现状

python - 如何使用praw获取线程标题?

ios - 使用在另一个 Swift VC 文件中创建的对象?

ruby-on-rails - 猴子修补设计(或任何 Rails gem)

ruby - 'Monkey Patching' 在 Ruby 中到底是什么意思?

python - CORBA python 文件在目录树中的级别与导入它们的模块不同

python - sqlalchemy 中按多列分组