您在此处看到的内容很常见(至少在一些 Python 包中)。如果你定义了一个.py 文件,它就充当了一个模块。例如django.views.generic.edit 模块映射到django/views/generic/edit.py file [GitHub]。
目录也是一个 Python 模块(由于 __init__.py 文件),但默认情况下它不包含任何元素,因此这意味着 django.views.generic 将为空。
如果我们看一下django/views/generic/__init__.py file [GitHub],我们会看到:
from django.views.generic.base import RedirectView, TemplateView, View
# ...
from django.views.generic.edit import (
CreateView, DeleteView, FormView, UpdateView,
)
# ...
__all__ = [
'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
]
# ...
因此,这会从generic.py 文件中导入UpdateView,然后重新导出该类。
因此,您可以通过两种方式引用该类:通过generic.py文件定义的模块,或通过__init__.py文件指定的目录模块的重新导出。
这通常用于导出文件中定义的项目的部分,以更方便的名称导出这些项目,或在模块级别提供一些额外的类(例如 @ 987654334@ 文件定义了GenericViewError 错误)。
因此,此目录级模块将有趣的视图“组合”在一起。例如,FormMixin 在此级别不导出。 __init__.py 这里将(流行的)基于类的视图组合在一起,而通常用于定义此类通用视图的 mixin 仍然特定于文件。