以下测试显示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的新手。)
答案 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
引用了。