首先这里是我的目录结构:
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
我在做什么错?
答案 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__
除了控制当前范围内的出口外,什么也没做。