python 中的魔法函数
本节参照 python杂记——魔法方法 进行总结和梳理。
魔法方法(magic methods):python 中的魔法方法是指方法名以两个下划线开头并以两个下划线结尾的方法,因此也叫 Dunder Methods (Double Underscores),常用于运算符重载。
魔法方法会在对类的某个操作时后端自动调用,而不需要自己直接调用。例如,创建一个类A的对象,a=A(),python就会自动调用__new__()和__init_()函数
类函数__init__()的理解
在创建类后,类通常会自动创建一个__init__()方法。该方法是一个特殊的方法,类似 JAVA 语言中的构造方法。每当创建一个类的新实例时,Python 都会自动执行它。init() 方法必须包含一个参数,并且必须是第一参数。self 参数是一个指向实例本身的引用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数 self。因此,当__init__()方法只有一个参数时,在创建类的实例时,就不需要指定参数了。
在__init__()方法中,除了 self 参数外,还可以自定义一些参数,参数间使用逗号“,”进行分隔。例如,init(self, a, b),但是在实例化类时,需要指定 a 和 b 这两个参数。
初始化和构造相关的魔法函数:
方法名 | 描述 |
---|---|
__new__(cls, other) | 在实例化一个对象的时候被调用 |
__init__(self, other) | 用于初始化对象,被__new__方法调用 |
__del__(self) | 对象的析构方法 |
集合相关的魔法函数:
方法名 | 描述 |
---|---|
__len__(self) | 被内置方法len()调用, 返回容器的长度, 可变和不可变的容器类型都需要实现 |
__getitem__(self, key) | 在使用key访问成员时调用, object[key] |
__setitem__(self, key, value) | 给集合中key值赋值时被调用, object[key] = value |
__delitem__(self, key) | 被del 调用, 例如: del object[key] |
__contains__(self) | 在执行in()或者not in时被调用 |
__reversed__(self) | 被内置方法reversed()调用, 翻转序列的顺序 |
__missing__(self) | 在字典的子类中使用,当试图访问字典中不存在的key时被调用 |
类函数__getitem__()的理解
在python中__getitem__(self,key)方法被称为魔法方法,这个方法返回所给键对应的值。
当对象是序列时,键是整数。当对象是映射时(字典),键是任意值。
在定义类时,如果希望能按照键取类的值,则需要定义__getitem__()方法。如果给类定义了__getitem__()方法,则当按照键取值时,可以直接返回__getitem__()方法执行的结果。
pytorch 中 forward() 函数
本节参考 #深入探究# PyTorch中的 forward() 方法详解 进行的总结梳理。
使用 PyTorch 进行模型训练时,不需要显式地调用 forward 函数,只要在实例化一个对象中传入对应的参数就可以自动调用 forward 函数。
PyTorch 中的大部分方法都继承自 torch.nn.Module,而 torch.nn.Module 的__call__(self) 函数中会返回 forward() 函数的结果,因此 PyTroch 中的 forward() 函数等于是被嵌套在了__call__(self) 函数中;因此 forward() 函数可以直接通过类实例化的对象被调用,而不用实例化对象。
class Module(nn.Module):
def __init__(self):
super(Module, self).__init__()
# ......
def forward(self, x):
# ......
return x
data = 10 # 输入数据
module = Module() # 实例化一个对象
module(data) # 前向传播,自动调用module.forward(data)