Прежде всего, вот моя структура каталогов:
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
Что я делаю неправильно?






Вам нужно будет указать, какой класс вы хотите импортировать в атрибут __all__ вашего файла __init__.py. См. Пример ниже:
from car import *
__all__ = ["Car"]
Теперь я получаю следующее: из импорта моделей * AttributeError: модуль 'models' не имеет атрибута 'Car'
Куда идут эти строки? У меня уже есть все = ["Car"] внутри файла в этом.py.
@johndoe: Это содержимое вашего файла __init__.py, и не забывайте, это Car, а не car, как в вашем примере.
Если вы хотите иметь прямой доступ к классу 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
Из питона документы:
if a package’s
__init__.pycode defines a list named__all__, it is taken to be the list of module names that should be imported whenfrom package import *is encountered.
Это означает, что ваш hello.py только что импортировал модуль car в свое пространство имен, нет - класс Car. Следовательно, это сработает.
from models import *
auto = car.Car()
Вы пропустили там один шаг.
Пытаться:
from models import *
car = car.Car()
Или попробуйте:
from models.car import *
car = Car()
__all__ просто контролирует то, что будет экспортировано, используя * в текущем объеме.
В вашем случае Car не входит в сферу вашего __init__.py. Так что это бессмысленно.
Чтобы решить эту проблему, вам нужно импортировать Car в область __init__.py, вот и все.
Я понимаю, что вы думаете, что просто используя __all__, вы можете получить прямой доступ к классу в car.py, но это неправда. __all__ не делает ничего, кроме контролировать экспорт в текущем объеме.
FWIW Я бы вообще рекомендовал никогда не импортировать
*. Никогда не надо, и "явное лучше, чем неявное". Это также совет, который дает PEP 8: «Следует избегать импорта подстановочных знаков (from <module> import *), поскольку они не позволяют понять, какие имена присутствуют в пространстве имен, что сбивает с толку как читателей, так и многие автоматизированные инструменты».