在Python3.7中使用_init__u.py文件导入*

在Python3.7中使用_init__u.py文件导入*,python,python-3.x,package,python-module,python-3.7,Python,Python 3.x,Package,Python Module,Python 3.7,首先是我的目录结构: Root - models car.py __init__.py hello.py 在\uuuu init\uuuuu.py中,我有以下内容: __all__ = ["car"] 在hello.py中,我尝试从models文件夹导入所有内容: from models import * car = Car() 这给了我一个错误: Traceback (most recent call last): File "h

首先是我的目录结构:

Root
   - models 
        car.py 
        __init__.py 
   hello.py 
\uuuu init\uuuuu.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
回溯(最近一次呼叫最后一次):
文件“hello.py”,第4行,在
汽车
NameError:未定义名称“Car”

我做错了什么

您必须指定要导入
\uuuuu init\uuuuuuuuy.py
文件的属性
中的类。请参见下面的示例:

from car import *
__all__ = ["Car"]

您必须指定要导入到
\uuuuuu init\uuuuuuuuy.py
文件的属性
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中的类。请参见下面的示例:

from car import *
__all__ = ["Car"]

如果您想在执行从模型导入的
操作后,在
hello.py
中直接访问类
Car
,请在
\uuuu init\uuuuuuuuuuuuuuuuuuuuuupy
文件中,将
从模型.Car导入Car

另一方面,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您可以将
hello.py
更改为如下所示,您当前的
\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
包含
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

如果您想在执行从模型导入的
操作后,在
hello.py
中直接访问类
Car
,请在
\uuuu init\uuuuuuuuuuuuuuuuuuuuuupy
文件中,将
从模型.Car导入Car

另一方面,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您可以将
hello.py
更改为如下所示,您当前的
\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
包含
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

如果包的
\uuuuu init\uuuuuuuupy.py
代码定义了名为
\uuuuuuu all\uuuuuuuuuuuu
的列表,则当遇到来自包导入*
时,它被视为应导入的模块名称列表

这意味着您的
hello.py
刚刚将
car
模块导入到它的命名空间中,而不是
car
类。因此,这是可行的

from models import *
auto = car.Car()
从python中:

如果包的
\uuuuu init\uuuuuuuupy.py
代码定义了名为
\uuuuuuu all\uuuuuuuuuuuu
的列表,则当遇到来自包导入*
时,它被视为应导入的模块名称列表

这意味着您的
hello.py
刚刚将
car
模块导入到它的命名空间中,而不是
car
类。因此,这是可行的

from models import *
auto = car.Car()

你错过了一步

尝试:

或者尝试:

from models.car import *

car = Car()

你错过了一步

尝试:

或者尝试:

from models.car import *

car = Car()

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

在您的情况下,
Car
不在您的
\uuuu init\uuuuuuuuupy
的范围内。所以这是毫无意义的

要解决此问题,您需要将
Car
导入
\uuuu init\uuuuuu.py
的范围,仅此而已


我知道您认为只要使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<代码>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

在您的情况下,
Car
不在您的
\uuuu init\uuuuuuuuupy
的范围内。所以这是毫无意义的

要解决此问题,您需要将
Car
导入
\uuuu init\uuuuuu.py
的范围,仅此而已


我知道您认为只要使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<代码>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
除了控制当前范围内的导出之外,其他什么都不做

现在我得到以下信息:从模型导入*属性错误:模块“模型”没有属性“汽车”,这些行到哪里去了?我在init.py文件中已经有了all=[“Car”]。@johndoe:这是你的
\uuu init\uuuuuuuuuuupy
文件的内容,别忘了,它是
Car
而不是
Car
像你的例子中那样。现在我得到以下信息:从模型导入*AttributeError:module'models'没有属性'Car'?我在init.py文件中已经有了所有=[“Car”]。@johndoe:这是你的
\uuu init\uuuuuuuuuupy
文件的内容,别忘了,它是
Car
而不是
Car
像你的例子一样。FWIW我通常建议避免导入
*
。没有必要,而且。这也是我们给出的建议:“应该避免通配符导入(
from import*
),因为通配符导入会使名称空间中存在的名称不清楚,从而使读者和许多自动化工具都感到困惑。”FWIW我通常建议避免导入
*
。没有必要,而且。这也是给出的建议:“应该避免通配符导入(
来自导入*
),因为它们使名称空间中存在的名称不清楚,从而混淆了读者和许多自动化工具。”