首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用类对象替换sys.modules中的当前模块时,导入的模块变为无

当使用类对象替换sys.modules中的当前模块时,导入的模块变为无
EN

Stack Overflow用户
提问于 2015-03-17 18:56:30
回答 1查看 1.5K关注 0票数 9

一种不受欢迎但“受支持”的python (请参阅Guido:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html)允许在模块属性上使用__getattr__,它涉及以下内容:

代码语言:javascript
复制
import os, sys

class MyClass(object):

    def check_os(self):
        print os

sys.modules[__name__] = MyClass()

在导入时,导入的模块将成为一个类实例:

代码语言:javascript
复制
>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>

但是,在Python-2.7中,原始模块中的所有其他导入模块都设置为None。

代码语言:javascript
复制
>>> repro.check_os()
None

在Python-3.4中,所有东西都能工作:

代码语言:javascript
复制
>>> 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中完全替换它),那么一切都继续工作:

代码语言:javascript
复制
sys.modules[__name__+'_bak'] = sys.modules[__name__]      
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-19 19:36:00

您正在运行的问题是,在3.4之前的Pythons中,当一个模块被销毁时(因为您用一个类替换它,并且没有对它的进一步引用),该模块的__dict__中的项被强制设置为None

如果您需要在3.4之前支持Pythons,那么解决方法是在类中有一个import语句来替换该模块:

代码语言:javascript
复制
class MyClass(object):

    import os

    def check_os(self):
        print(os)

有关更多信息,请参见this answer about interpreter shutdown

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29107470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档