Python:修改导入的类时会发生什么?

Python:修改导入的类时会发生什么?,python,Python,我编写了以下代码来修改一个类的方法的行为 import mymodule mymodule.MyClass.f = mydecorator(mymodule.MyClass.f) mymodule.MyClass.f(x) # call the modified function 这符合我的目的,但是:我到底修改了什么?mymodule.MyClass是当前模块中原始类的副本吗?它对原始类有任何影响吗?导入究竟是如何工作的?修改导入的模块时,需要修改缓存的实例。因此,您的更改将影响导入修改模块

我编写了以下代码来修改一个类的方法的行为

import mymodule
mymodule.MyClass.f = mydecorator(mymodule.MyClass.f)
mymodule.MyClass.f(x) # call the modified function

这符合我的目的,但是:我到底修改了什么?
mymodule.MyClass
是当前模块中原始类的副本吗?它对原始类有任何影响吗?导入究竟是如何工作的?

修改导入的模块时,需要修改缓存的实例。因此,您的更改将影响导入修改模块的所有其他模块

更新:

你可以测试一下

更改\u 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:

b、 py:

c、 py:

现在,在顶层脚本(或交互式解释程序)中,我写道:

输出将是:

'foo at <c.C object at 0x0000013E4A65D080>'
'bar at <c.C object at 0x0000013E4A65D080>'
“foo at”
“酒吧”

这可能是您想要的,但更改已在
b
模块中完成,并且确实影响
a
模块。

例如,您在某个文件中声明
x=5
。。。现在,另一个程序导入
x
,并将其更改为10。发生了什么事?@cᴏʟᴅsᴘᴇᴇᴅ: 我不能完全肯定什么都没发生。原稿没有修改。您要导入的只是一个副本到您的命名空间中。@cᴏʟᴅsᴘᴇᴇᴅ: 谢谢
import c

def change():
    c.C.foo = (lambda self: "bar at " + str(self))
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>'