Python,类定义中的伪造模块

时间:2013-07-05 04:49:41

标签: python

我怀疑这是导致“为什么要这样做?”的问题之一。但是这里有:

我需要找到一种方法来伪造__main__中定义的类的模块;即:

假设我们有a.py:

class A(object):
    name = "a"
    pass

并且b.py:

import inspect
import a

class B(object):
    __name__ = a.__name__
    name = "b"
    pass

print inspect.getmodule(B)

调用b.py导致:

<module '__main__' from 'b.py'>

那么,如何将A类模块视为b,而不将其移入b?

1 个答案:

答案 0 :(得分:0)

您可以设置班级的__module__属性,但有一些警告:

class A(object):
    __module__ = 'b'

主要警告是,如果在您拨打getmodule时尚未导入模块b,则会导致getmodule(A)返回无。我认为,如果以某种非标准方式导入b,也可能出现问题,例如通过隐式相对导入而不是作为包的一部分导入它(如果它是包的一部分)。

但从概念上讲,你所做的事情有点可疑。将A模块设置为其他模块是有风险的,因为当真实模块可能不知道(即导入)该模块时,实际上可能甚至不存在“伪装”模块。