Đó thực sự chỉ là sở thích cá nhân và liên quan đến cách bố trí các mô-đun python của bạn.
Giả sử bạn có một mô-đun được gọi erikutils. Có hai cách mà nó có thể là một mô-đun, hoặc là bạn có một tập tin gọi là erikutils.py trên của bạn sys.pathhoặc bạn có một thư mục gọi là erikutils trên của bạn sys.pathvới một sản phẩm nào __init__.pytập tin bên trong nó. Sau đó, giả sử bạn có một loạt các module gọi là fileutils, procutils, parseutilsvà bạn muốn những là sub-module dưới erikutils. Vì vậy, bạn tạo một số tệp .py có tên là fileutils.py , procutils.py và parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Có lẽ bạn có một vài chức năng mà chỉ cần không thuộc trong fileutils, procutilshoặc parseutilsmô-đun. Và giả sử bạn không muốn tạo một mô-đun mới có tên miscutils. VÀ, bạn muốn có thể gọi hàm như vậy:
erikutils.foo()
erikutils.bar()
thay vì làm
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Vì vậy, bởi vì erikutilsmô-đun là một thư mục, không phải một tệp, chúng ta phải xác định các chức năng của nó bên trong __init__.pytệp.
Trong django, ví dụ tốt nhất mà tôi có thể nghĩ đến là django.db.models.fields. TẤT CẢ các lớp trường django * được định nghĩa trong __init__.pytệp trong thư mục django / db / models / fields . Tôi đoán họ đã làm điều này bởi vì họ không muốn nhồi nhét mọi thứ vào một giả thuyết django / db / mô hình / fields.py mô hình, vì vậy họ chia nó ra thành một vài submodules ( related.py , files.py , ví dụ) và họ đã gắn các định nghĩa trường * được thực hiện trong chính mô-đun trường (do đó, __init__.py).