本文共 2634 字,大约阅读时间需要 8 分钟。
以一个猫狗识别的程序为例,说说__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 npimport cv2import osclass 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 KNeighborsClassifierfrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom pyimagesearch.preprocessing import SimplePreprocessorfrom pyimagesearch.datasets import SimpleDatasetLoaderfrom imutils import pathsimport 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:
转载地址:http://uwtnn.baihongyu.com/