一种不受欢迎但“受支持”的python (请参阅Guido:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html)允许在模块属性上使用__getattr__,它涉及以下内容:
import os, sys
class MyClass(object):
def check_os(self):
print os
sys.modules[__name__] = MyClass()在导入时,导入的模块将成为一个类实例:
>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>但是,在Python-2.7中,原始模块中的所有其他导入模块都设置为None。
>>> repro.check_os()
None在Python-3.4中,所有东西都能工作:
>>> repro.check_os()
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'>这似乎与Imported modules become None when running a function有关,但是,有谁知道为什么内部会发生这种情况呢?
如果您存储原始模块(而不是在Python-2中完全替换它),那么一切都继续工作:
sys.modules[__name__+'_bak'] = sys.modules[__name__] 发布于 2015-05-19 19:36:00
您正在运行的问题是,在3.4之前的Pythons中,当一个模块被销毁时(因为您用一个类替换它,并且没有对它的进一步引用),该模块的__dict__中的项被强制设置为None。
如果您需要在3.4之前支持Pythons,那么解决方法是在类中有一个import语句来替换该模块:
class MyClass(object):
import os
def check_os(self):
print(os)有关更多信息,请参见this answer about interpreter shutdown。
https://stackoverflow.com/questions/29107470
复制相似问题