如何在Python中调整完全限定类名的模块部分?

时间:2018-06-02 22:44:59

标签: python python-3.x

以下测试显示Python将A解释为dir.a.A。如何让Python将A解释为dir.A

$ find * -name "*.py"
dir/a.py
dir/__init__.py
main.py


$ cat dir/a.py
class A():
    pass


$ cat dir/__init__.py
from .a import A


$ cat main.py
from dir import A
print(A)


$ python3 main.py
<class 'dir.a.A'>

我知道以下内容可以产生我想要的结果,但我想在不改变目录/文件结构的情况下实现它。

$ ls
dir.py main.py


$ cat dir.py
class A():
    pass


$ cat main.py
from dir import A
print(A)


$ python3 main.py
<class 'dir.A'>

或者,我不应该关心这个吗? (我是Python的新手。)

1 个答案:

答案 0 :(得分:2)

首先:你不需要这样做,你可能不想这样做。标准库中充满了示例,其中文档用作导入位置以及对象的实际模块信息不同:

>>> from unittest import TestCase
>>> TestCase
<class 'unittest.case.TestCase'>

完整的模块位置由pickle等工具使用(在序列化实例时仅存储对类的引用)。

如果您认为必须更改__module__属性,则可以设置该属性;它是一个命名完整模块路径的字符串:

>>> class A():
...     pass
...
>>> A
<class '__main__.A'>
>>> A.__module__
'__main__'
>>> A.__module__ = 'dir'
>>> A
<class 'dir.A'>

这与模块上的__name__属性值相同。它可作为模块中的全局,在__init__中使用

from .a import A

A.__module__ = __name__  # rehome here. 

对于像pickle这样的工具,因为您实际上dir.A模块中 dir引用了。