__all__ 在 __init__.py 中不生效? [复制]
Posted
技术标签:
【中文标题】__all__ 在 __init__.py 中不生效? [复制]【英文标题】:__all__ does not take effect in __init__.py? [duplicate] 【发布时间】:2022-01-06 20:20:10 【问题描述】:下面是我的包的结构:
my_package/
├── __init__.py
├── mod1.py
├── mod2.py
└── mod3.py
下面是我的包的示例代码:
$ cat my_package/__init__.py
__all__ = ['mod1', 'mod2']
$ cat my_package/mod1.py
print("this is mod1")
class Mod1():
def do1(self):
print("do 1")
$ cat my_package/mod2.py
print("this is mod2")
class Mod2():
def do2(self):
print("do 2")
$ cat my_package/mod3.py
print("this is mod3")
class Mod3():
def do3(self):
print("do 3")
如下方式导入时报错: AttributeError: 'module' 对象没有属性 'mod1'
>>> import my_package
>>> my_do = my_package.mod1.Mod1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'mod1'
>>>
我将__init__.py
更改为以下内容:
__all__ = ['mod1', 'mod2']
from my_package import *
通过以下方式导入没有报错:
>>> import my_package
this is mod1
this is mod2
>>> my_do = my_package.mod1.Mod1()
>>> my_do.do1()
do 1
>>>
所以我认为__all__
不起作用,对吗?如果不是,那么根本情况是什么?
【问题讨论】:
__all__
仅适用于 from my_packge import *
,这是您应该避免并且可能不鼓励的事情。
在相关问题中阅读此答案:***.com/a/35710527/5014455,但也请查看上面链接的副本
@juanpa.arrivillaga 谢谢
【参考方案1】:
看起来__init__.py
只是不知道 mod1 和 mod2 是什么。 Python 是一种解释型语言,因此您需要在 __all__
中导入 __init__.py
中的模块以使其按预期工作
【讨论】:
以上是关于__all__ 在 __init__.py 中不生效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章