Bub*_*bai 8 python python-import python-2.7 python-3.x
一个不受欢迎但"支持"的python hack(参见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'>
这感觉与导入的模块有关,在运行函数时变为无,但是,任何人都知道为什么这会在内部发生?
看来如果你存储原始模块(没有在Python-2中完全替换它),那么一切都继续工作:
sys.modules[__name__+'_bak'] = sys.modules[__name__]      
你遇到的问题是在3.4之前的Pythons中,当一个模块被销毁时(因为你用一个类替换它并且没有进一步的引用),该模块中的项__dict__被强制设置为None.
解决方法,如果你需要在3.4之前支持Pythons,那么import在类中将有一个将替换模块的语句:
class MyClass(object):
    import os
    def check_os(self):
        print(os)
有关更多信息,请参阅有关解释器关闭的答案.