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

时间:2018-09-23 23:44:48

标签: python python-3.x package python-module python-3.7

首先这里是我的目录结构:

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

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

__all__ = ["car"]

hello.py内部,我尝试从models文件夹中导入所有内容:

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

我在做什么错?

5 个答案:

答案 0 :(得分:1)

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

from car import *
__all__ = ["Car"]

答案 1 :(得分:0)

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

另一方面,

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

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

答案 2 :(得分:0)

通过python docs

  

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

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

from models import *
auto = car.Car()

答案 3 :(得分:0)

您错过了那一步。

尝试:

from models import *

car = car.Car()

或尝试:

from models.car import *

car = Car()

答案 4 :(得分:0)

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

对于您来说,Car不在您的__init__.py范围内。所以这是没有意义的。

要解决此问题,您需要将Car导入__init__.py的范围内。

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