python - 当`sys.modules`包含不同的对象时如何访问原始模块范围?
问题描述
如何在不修改的情况下导入my_module
和修改 的值?原始符号表是否可用,即使它被实例覆盖了?_value
my_module.py
my_module.py
MyModule
sys.modules
# my_module.py
import types, sys
_value = 5
class MyModule(types.ModuleType):
@property
def value(self):
global _value
return _value
sys.modules[__name__] = MyModule(__name__)
我正在寻找的是一种实现这一目标的技术:
import my_module
assert my_module.value == 5
# Some code to alter `_value`
assert my_module.value == 7
解决方案
我不确定是否填写您的目标,但让我们尝试一下。它可能会帮助...
#file my_module.py
class MyModule:
_value = 5 #this is a class attribute
def get_value(self):
return MyModule._value #referred to prefixed by the class Name
def set_value(self,val):
MyModule._value = val
value = property(get_value, set_value) #clearer than the decorator, to me
在外壳中:
>>>from my_module import *
>>>m = MyModule() #instantiate an object
>>>m.value #returns 5
>>>m.value = 7
>>>m.value #returns 7