【问题标题】:Importing classes contained in a module导入模块中包含的类
【发布时间】:2023-04-06 14:28:01
【问题描述】:

我的目录中有以下文件:

foo/
  foo.py
  foolib/
    __init__.py
    bar.py

在 __init__.py 内:

__all__ = ["bar"]

在 bar.py 中:

class Bar:
    def __init__(self):
        None
    def hello(self):
        print("Hello World")
        return

def hi():
    print("Hi World")

现在如果我在 foo.py 中有以下代码:

from foolib import *

bar.hi()

foobar = Bar()
foobar.hello()

“Hi World”打印,但我得到 Bar() 的 NameError。如果我显式导入模块:

from foolib.bar import *

我得到了预期的输出“Hello World”。

有没有办法让我从模块中导入类,而不显式调用它们?我觉得我在 __init__ 文件中遗漏了一些东西。要么这样,要么我公然违反了一些 Python 最佳实践。

【问题讨论】:

    标签: python


    【解决方案1】:

    要导入类,您必须在某处导入类。当您执行from foolib import * 时,由于您的__init__.py,这将导入模块bar。它不允许您访问该模块内的任何内容。

    如果您想从foolib 包中自动访问bar 中的所有内容而无需导入bar,您可以将其放入__init__.py

    from bar import *
    

    这使得bar 中的所有内容都可以直接在foolib 中使用。

    【讨论】:

    • 工作正常,但它仍然显式调用模块。还有其他方法吗?我觉得这不适用于多个模块。
    • 您是说要自动导入包中所有模块的所有内容吗?您可以这样做,但您必须手动进行,通过查找目录中的所有文件并以编程方式导入它们。这也不太可能是一个好主意,因为如果任何模块定义相同的名称,它将导致命名空间冲突。正因为如此,Python 没有提供任何简单的方法来做到这一点。正确的方法是显式导入你要使用的模块。
    • 是的,这就是我要找的。我想它会是这样的。谢谢。我会坚持明确地导入它们。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2017-01-21
    相关资源
    最近更新 更多