当前位置: 代码迷 >> python >> 使用__init__.py文件在Python 3.7中导入*
  详细解决方案

使用__init__.py文件在Python 3.7中导入*

热度:71   发布时间:2023-06-27 21:17:28.0

首先是我的目录结构:

Root
   - models 
        car.py 
        __init__.py 
   hello.py 

__init__.py内部,我有以下内容:

__all__ = ["car"]

hello.py我尝试从模型文件夹中导入所有内容:

from models import *

car = Car()

这给了我错误:

Traceback (most recent call last):
  File "hello.py", line 4, in <module>
    car = Car()
NameError: name 'Car' is not defined

我究竟做错了什么?

您将必须指定要导入__init__.py文件的属性__all__的类。 参见下面的示例:

from car import *
__all__ = ["Car"]

如果您希望在from models import *执行hello.py之后直接在hello.py直接访问Car类,请在__init__.py文件中, from models.car import Car放入。

另一方面, __all__ 通常会列出模块名称,就像上面的内容一样。 您可以将hello.py更改为如下所示,并且当前由__all__ = ["car"]组成的__init__.py将起作用:

from models import *
car_obj = car.Car() # Reference module.class instead of just the class

从python :

如果程序包的__init__.py代码定义了名为__all__的列表,则将其视为遇到from package import *导入的模块名称的列表。

这意味着您的hello.py刚刚将car模块导入了它的名称空间, 而不是 Car类。 因此,这将起作用。

from models import *
auto = car.Car()

您错过了一步。

尝试:

from models import *

car = car.Car()

或尝试:

from models.car import *

car = Car()

__all__仅控制在当前范围内使用*导出的内容。

就您而言, Car不在__init__.py的范围内。 所以这是没有意义的。

要解决此问题,您需要将Car导入__init__.py的作用域。

我了解您认为,只需使用__all__ ,您就可以直接访问car.py的类,但这不是事实。 __all__除了在当前范围内控制出口之外什么也不做。