__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 中不生效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

关于python 的__init__.py 以及 __all__ 的用法

8.1包,__init__.py,

Python中__init__.py文件作用之我见

Python __all__变量用法

python __init__.py 文件的作用

在 __main__.py 中使用模块自己的对象