也說說Python中__init__.py的作用
以一個貓狗識別的程式為例,說說__init__.py的作用。
在windows的cmd命令列中,使用下面指令把所在路徑下面的所有檔案以樹的形式列出。
tree /F > D:\tree.txt
我手頭上的一個使用knn進行貓狗分類的專案,包含有以下的檔案。
│ knn.py ├─pet_sample │ ├─cat1 │ │ │ └─dog1 │ └─pyimagesearch │ __init__.py │ __init__.pyc │ ├─datasets │ simpledatasetloader.py │ simpledatasetloader.pyc │ __init__.py │ __init__.pyc │ └─preprocessing simplepreprocessor.py simplepreprocessor.pyc __init__.py __init__.pyc
主要的檔案有三個knn.py,simplepreprocessor.py和simpledatasetloader.py。knn.py是主檔案。使用python knn.py時候會呼叫後面兩個檔案。*.pyc都是編譯時候自動生成的。
simplepreprocessor.py檔案內容如下:
import cv2 class SimplePreprocessor: def __init__(self, width, height, inter=cv2.INTER_AREA): self.width = width self.height = height self.inter = inter def preprocess(self, image): return cv2.resize(image, (self.width, self.height), interpolation=self.inter) if __name__ == '__main__': s = SimplePreprocessor(32, 32) img = cv2.imread('/home/xxjian/DeepLearningMaterial/kagglecatsanddogs_3367a/PetImages/Cat/9759.jpg') cv2.imshow('src', img) cv2.imshow("resize", s.preprocess(img)) cv2.waitKey(0)
其中下面程式碼的作用就是當使用python simplepreprocessor.py呼叫本檔案時,就會執行這段程式碼。若只以引用的方式呼叫本檔案,則不執行保本語句包含的程式碼段。
if __name__ == '__main__':
另外本檔案具有一個類SimplePreprocessor。為了使別的檔案可以呼叫SimplePreprocessor這個類,需要在simplepreprocessor.py的所在資料夾中新建一個__init__.py
檔案內容如下:
__all__ = ['SimplePreprocessor'] from simplepreprocessor import *
這樣即可把包含了simplepreprocessor.py、__init__.py的資料夾preprocessor當作是一個庫。
同樣的在simpledatasetloader.py中有兩個類,SimplePreprocessor和SimpleDatasetLoader。
import numpy as np
import cv2
import os
class SimplePreprocessor:
# 略
class SimpleDatasetLoader:
# 略
if __name__ == '__main__':
# 略
和simpledatasetloader.py處於同一個資料夾的__init__.py中的內容如下:
__all__ = ['SimplePreprocessor', 'SimpleDatasetLoader']
from simpledatasetloader import *
這樣就知道datasets資料夾內包含有以下的Class(類)。
knn.py是本工程的主檔案。使用python knn.py可以執行本程式。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from pyimagesearch.preprocessing import SimplePreprocessor
from pyimagesearch.datasets import SimpleDatasetLoader
from imutils import paths
import argparse
if __name__ == '__main__':
# 以下程式碼略
程式碼中的pyimagesearch、preprocessing、datasets都是資料夾,要用from關鍵字。
而import匯入的是類,上面呼叫的SimplePreprocessor和SimpleDatasetLoader都是類。
之後在pyimagesearch中的__init__.py的內容是:
from datasets import __all__
from preprocessing import __all__
這樣,knn.py就可以找得到所需要的類了。
以上就是本工程的介紹。總的來說,__init__.py作用是形成了類的索引。沒看過書,不知有沒有錯,這就是我的理解了。