一个不受欢迎但受支持的python hack(请参阅Guido:https://mail.python.org/pipermail/python- ideas/2012-May/014969.html),它可以__getattr__在模块属性上使用,涉及以下内容:
__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'>
感觉与导入的模块有关,在运行函数时变为None,但是,有人知道为什么在内部发生这种情况吗?
看来,如果您存储原始模块(在Python-2中没有完全替换它),那么一切将继续进行:
sys.modules[__name__+'_bak'] = sys.modules[__name__]
您遇到的问题是,在3.4之前的Python中,当一个模块被销毁时(就像您那样,因为您将其替换为一个类,并且没有对其的进一步引用),所以该模块中的项目__dict__被强制设置为None。
__dict__
None
如果您需要在3.4之前支持Python,则解决方法是import在类中有一条替换该模块的语句:
import
class MyClass(object): import os def check_os(self): print(os)