问题描述
首先是我的目录结构:
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__除了在当前范围内控制出口之外什么也不做。