深度学习Python基础-类和模块相关
示例目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.
├── __init__.py
├── base
│ ├── __init__.py
│ ├── data_format.py
│ ├── mnn_forward_base.py
│ └── mnn_net.py
├── lib
│ ├── __init__.py
│ ├── bbox_transform.py
│ ├── blob.py
│ ├── mean_face.py
│ ├── mnn_face.py
│ ├── mnn_face_allign.py
│ ├── mnn_face_det.py
│ └── nms_wrapper.py
├── main.py
├── requirements.txt
└── version.json
目录和模块(package
)
在目录中添加 __init__.py
文件,用于将一个目录标识为一个包(package),你可以使用 import
关键字将模块进行导入。
主要用途
标识目录为包:当一个目录下存在
__init__.py
文件时,Python 解释器会认为这个目录是一个包,可以包含模块或子包。初始化包内容:可以在
__init__.py
文件中定义一些初始化代码,这些代码会在导入包中的任何模块之前执行。定义包级别的变量和函数:通过
__init__.py
文件,可以定义一些公共的变量、函数或者类,供包内的其他模块使用。控制包的导入行为:在
__init__.py
文件中可以通过导入包内的其他模块来控制它们的导入顺序,或者让导入包的操作自动加载某些模块。支持 from package import * 操作:如果
__init__.py
文件中定义了__all__
变量,那么可以从包中使用import *
的方式导入指定的模块或对象。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MNNFacePlayground(DebugUIBaseClass):
def __init__(self):
#create global net
self.global_net = MNNFace(det_model_path, allign_model_path)
def process(self, type, id, batch_data):
# ...
@staticmethod
def convertInputImageToRGB(input_data, data_format):
#...
def __del__(self):
print "End"
@classmethod
def init(cls):
global ins = cls()
if __name__ == '__main__':
MNNFacePlayground.init()
pass
关键字
pass
是Python
中的一个关键字。它是一个空操作,表示什么都不做,通常作为占位符或者在流程控制结构中用来表明空语句。
示例:
1
2
def process(self, batch_data):
pass
global
关键字
global
关键字在 Python
中用于声明一个全局变量。具体说明如下:
- 作用:使用
global
可以在函数内部修改全局作用域中的变量。 - 用法:在函数内声明变量为全局变量,使其可以被函数外部定义的同名变量引用和修改。
例如:
1
2
3
4
5
6
7
8
x = 5
def test():
global x
x = 10 # 修改全局变量 x 的值
test()
print(x) # 输出 10
def __init__(self):
方法
__init__
是 Python 类中一个特殊的方法,也称为魔术方法。它的名称是固定的,必须是 __init__
。这个方法主要用于在创建类的实例时进行初始化操作。尽管名称固定,但它对于确保类实例正确初始化非常重要
总结:功能类似于 C++的构造函数。
def __del__(self):
方法
该函数是Python类中的析构函数。功能如下:
- 在对象被销毁时自动调用,通常用于执行清理操作,如关闭文件或释放资源。
- 无法返回任何值,也不需要返回值。
- 可能不会总是被调用,因为Python的垃圾回收机制可能导致对象在任何时候被销毁。
总结:功能类似 C++ 析构函数
@staticmethod
修饰
通常,@staticmethod
用于定义一个类中的静态方法,该方法不需要访问或修改类的状态。静态方法与类实例无关,因此在调用时不需要传入 self
参数
如:
1
2
3
@staticmethod
def convertInputImageToRGB(input_data, data_format):
# func body, do something...
@classmethod
修饰
@classmethod
是一个装饰器,用于定义类方法。类方法的第一个参数通常为cls
,代表类本身,而非实例
如:
1
2
3
@classmethod
def init(cls):
ins = cls() # 创建一个 cls 类的实例
@classmethod
和 @staticmethod
的主要区别在于它们的第一个参数和用途:
- classmethod:
- 第一个参数通常是
cls
,表示类对象。 - 可以访问或修改类的状态。
- 第一个参数通常是
- staticmethod:
- 没有默认的第一个参数。
- 不自动接收类或实例作为第一个参数。
- 通常用于辅助功能,与类状态无关。
简单来说,@classmethod
与类直接相关,可以操作类变量;而 @staticmethod
则更像是一个普通的函数,只是作为类的一部分存在。
__main__
内置变量
__name__ == '__main__'
的作用如下:
__name__
是 Python 自带的一个变量,当文件作为模块被导入时,其值为模块名。- 当文件直接运行时,
__name__
的值为'__main__'
。 - 通过此判断,可以决定哪些代码在直接运行文件时执行,而在作为模块导入时不执行,从而避免代码冲突。
self
参数
self
是传递给 __init__
方法的第一个参数。它代表类的实例本身,使得实例方法能够访问并操作类的属性和方法。在 Python 中,self
通常作为约定俗成的第一个参数名出现在实例方法中,但在调用时不需要显式传入。