1. 程式人生 > >也說說Python中__init__.py的作用

也說說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作用是形成了類的索引。沒看過書,不知有沒有錯,這就是我的理解了。