文章

深度学习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 关键字将模块进行导入。

主要用途

  1. 标识目录为包:当一个目录下存在 __init__.py 文件时,Python 解释器会认为这个目录是一个包,可以包含模块或子包。

  2. 初始化包内容:可以在 __init__.py 文件中定义一些初始化代码,这些代码会在导入包中的任何模块之前执行。

  3. 定义包级别的变量和函数:通过 __init__.py 文件,可以定义一些公共的变量、函数或者类,供包内的其他模块使用。

  4. 控制包的导入行为:在 __init__.py 文件中可以通过导入包内的其他模块来控制它们的导入顺序,或者让导入包的操作自动加载某些模块。

  5. 支持 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关键字

passPython中的一个关键字。它是一个空操作,表示什么都不做,通常作为占位符或者在流程控制结构中用来表明空语句。

示例:

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类中的析构函数。功能如下:

  1. 在对象被销毁时自动调用,通常用于执行清理操作,如关闭文件或释放资源。
  2. 无法返回任何值,也不需要返回值。
  3. 可能不会总是被调用,因为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__' 的作用如下:

  1. __name__ 是 Python 自带的一个变量,当文件作为模块被导入时,其值为模块名。
  2. 当文件直接运行时,__name__ 的值为 '__main__'
  3. 通过此判断,可以决定哪些代码在直接运行文件时执行,而在作为模块导入时不执行,从而避免代码冲突。

self 参数

self 是传递给 __init__ 方法的第一个参数。它代表类的实例本身,使得实例方法能够访问并操作类的属性和方法。在 Python 中,self 通常作为约定俗成的第一个参数名出现在实例方法中,但在调用时不需要显式传入。

本文由作者按照 CC BY 4.0 进行授权