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

时间:2017-10-26 12:41:24

标签: python

我编写了以下代码来修改一个类

的方法的行为
import mymodule
mymodule.MyClass.f = mydecorator(mymodule.MyClass.f)
mymodule.MyClass.f(x) # call the modified function

这适用于我的目的,但是:我完全修改了什么? mymodule.MyClass是否存在于当前模块中的原始类的副本?它会以任何方式影响原始课程吗?导入如何正常工作?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这取决于。在正常使用情况下,一切都应该没问题。但是可以想象一下特殊情况会导致奇怪的结果:

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模块。