在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我通常建议避免导入*
。没有必要,而且。这也是给出的建议:“应该避免通配符导入(来自导入*
),因为它们使名称空间中存在的名称不清楚,从而混淆了读者和许多自动化工具。”