首页 > 解决方案 > 当`sys.modules`包含不同的对象时如何访问原始模块范围?

问题描述

如何在不修改的情况下导入my_module和修改 的值?原始符号表是否可用,即使它被实例覆盖了?_valuemy_module.pymy_module.pyMyModulesys.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

标签: python

解决方案


我不确定是否填写您的目标,但让我们尝试一下。它可能会帮助...

#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

推荐阅读