问题描述
首先是我的目录结构:
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
我究竟做错了什么?
1楼
您将必须指定要导入__init__.py
文件的属性__all__
的类。
参见下面的示例:
from car import *
__all__ = ["Car"]
2楼
如果您希望在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
3楼
从python :
如果程序包的
__init__.py
代码定义了名为__all__
的列表,则将其视为遇到from package import *
导入的模块名称的列表。
这意味着您的hello.py
刚刚将car
模块导入了它的名称空间, 而不是 Car
类。
因此,这将起作用。
from models import *
auto = car.Car()
4楼
您错过了一步。
尝试:
from models import *
car = car.Car()
或尝试:
from models.car import *
car = Car()
5楼
__all__
仅控制在当前范围内使用*
导出的内容。
就您而言, Car
不在__init__.py
的范围内。
所以这是没有意义的。
要解决此问题,您需要将Car
导入__init__.py
的作用域。
我了解您认为,只需使用__all__
,您就可以直接访问car.py
的类,但这不是事实。
__all__
除了在当前范围内控制出口之外什么也不做。