【问题标题】:__all__ does not take effect in __init__.py? [duplicate]__all__ 在 __init__.py 中不生效? [复制]
【发布时间】: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 *,这是您应该避免并且可能不鼓励的事情。
  • 在相关问题中阅读此答案:stackoverflow.com/a/35710527/5014455,但也请查看上面链接的副本
  • @juanpa.arrivillaga 谢谢

标签: python import module package


【解决方案1】:

看起来__init__.py 只是不知道 mod1 和 mod2 是什么。 Python 是一种解释型语言,因此您需要在 __all__ 中导入 __init__.py 中的模块以使其按预期工作

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2013-05-08
    • 2015-08-19
    • 2022-01-01
    • 2014-06-08
    相关资源
    最近更新 更多