以一个猫狗识别的程序为例,说说__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作用是形成了类的索引。没看过书,不知有没有错,这就是我的理解了。
参考资料1:Python __init__.py 作用详解