To tylko osobiste preferencje i ma związek z układem modułów w Pythonie.
Powiedzmy, że masz moduł o nazwie erikutils
. Istnieją dwa sposoby, że może to być moduł, albo masz plik o nazwie erikutils.py na własną sys.path
lub masz katalog o nazwie erikutils na własną sys.path
pustym __init__.py
pliku wewnątrz niego. Pozwól, że masz kilka modułów zwanych fileutils
, procutils
, parseutils
i chcesz te podwykonawstwa w ramach modułów mocy erikutils
. Więc tworzysz kilka plików .py o nazwach fileutils.py , procutils.py i parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Może masz kilka funkcji, które po prostu nie należą w fileutils
, procutils
lub parseutils
modułów. Powiedzmy, że nie masz ochoty tworzyć nowego modułu o nazwie miscutils
. ORAZ chciałbyś móc wywołać funkcję w ten sposób:
erikutils.foo()
erikutils.bar()
zamiast robić
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Więc ponieważ erikutils
moduł jest katalogiem, a nie plikiem, musimy zdefiniować jego funkcje wewnątrz __init__.py
pliku.
W django najlepszym przykładem, jaki przychodzi mi do głowy, jest django.db.models.fields
. WSZYSTKIE klasy django * Field są zdefiniowane w __init__.py
pliku w katalogu django / db / models / fields . Myślę, że zrobił to dlatego, że nie chce się dopchać wszystko do hipotetycznego django / db / models / fields.py modelu, więc podzielić ją na kilka submodułów ( related.py , files.py , na przykład) i utknęli utworzone * definicje pól w samym module pól (stąd, __init__.py
).