我编写了以下代码来修改一个类的方法的行为
import mymodule
mymodule.MyClass.f = mydecorator(mymodule.MyClass.f)
mymodule.MyClass.f(x) # call the modified function
这适用于我的目的,但是:我到底修改了什么?mymodule.MyClass
是存在于当前模块中的原始类的副本吗?它是否以任何方式影响原始类?导入究竟是如何工作的?
修改导入的模块时,会修改缓存的实例。因此,您的更改将影响导入修改后的模块的所有其他模块。
https://docs.python.org/3/reference/import.html#the-module-cache
更新:
您可以对其进行测试。
change_sys.py:
import sys
# Let's change a module
sys.t = 3
main.py:
# the order of imported modules doesn't meter
# they both use cached sys
import sys
import change_sys
print(sys.t)
python ./main.py
输出 :
3
这取决于。在正常用例中,一切都应该没问题。但人们可以想象特殊情况下,它会导致奇怪的结果:
a.py:
import c
x = c.C()
def disp():
return x.foo()
b.py:
import c
def change():
c.C.foo = (lambda self: "bar at " + str(self))
c.py:
class C:
def foo(self):
return "foo at " + str(self)
现在在顶级脚本(或交互式解释器)中,我写道:
import a
import b
a.disp()
b.change()
a.disp()
输出将是:
'foo at <c.C object at 0x0000013E4A65D080>'
'bar at <c.C object at 0x0000013E4A65D080>'
这可能是您想要的,但更改已在b
模块中完成,并且确实会影响a
模块。