也说说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作用是形成了类的索引。没看过书,不知有没有错,这就是我的理解了。

参考资料1:Python __init__.py 作用详解

猜你喜欢

转载自blog.csdn.net/qq_27158179/article/details/82930877