前言
参考视频:视频
一、魔术方法
首先看一看chatgpt对魔术方法(特殊方法)的解释:
Python的魔术方法(Magic Methods),也称为特殊方法(Special Methods),是一些在类定义中使用**双下划线(__)**包围的方法。这些方法可以被Python解释器调用,用于实现对象的特定行为或操作。
以下是一些常用的Python魔术方法:
__init __(self, …): 构造函数,用于初始化对象的属性。
__len __(self): 返回对象的长度。
__getitem __(self, key): 返回对象中指定键的值。
setitem(self, key, value): 设置对象中指定键的值。
…等等
这些魔术方法可以让Python类的实例对象表现得像内置类型一样,从而方便地实现自定义的行为和操作。
其中构造函数是最经典的特殊方法
二、构造方法
Python类的构造方法是__init__方法,用于初始化对象的属性。当我们创建一个类的实例时,__init__方法会被自动调用,用于为新创建的对象设置初始的属性值。__init__方法通常需要至少一个参数self,用于引用新创建的对象本身,其他参数根据需要自行添加。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 20)
print(p.name) # 输出:Alice
print(p.age) # 输出:20
在上述代码中,我们定义了一个Person类,其中的__init__方法接收两个参数name和age,分别用来初始化对象的name和age属性。当我们创建一个Person对象时,会自动调用__init__方法,并将name和age参数传递给它,以便设置新创建的对象的name和age属性。最后,我们通过打印对象的属性值来验证对象是否正确地初始化。
三、__ getitem __方法
__getitem__方法是Python的一个魔术方法,用于实现索引操作。当我们对一个对象进行索引操作时,例如obj[key],Python解释器会自动调用该对象的__getitem__方法,并将索引值key作为参数传递给它。
class MyList:
def __init__(self, data):
self.data = data
my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0]) # 输出:1
print(my_list[2]) # 输出:3
正常情况下运行代码会报错 无法打印元素:
但是稍稍做一些修改,在类内加入特殊方法getitem救能打印列表元素了
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0]) # 输出:1
print(my_list[2]) # 输出:3
在学深度学习的时候一直有个疑问:在生成mydataset数据集对象的时候,__getitem___会被自动调用吗?
__getitem__方法不会在生成对象的时候自动调用,它是在通过Dataset对象索引访问数据集中的元素时自动调用的。也就是说,当我们通过下标访问数据集中的元素时,例如 dataset[0],就会调用__getitem__方法来获取数据集中的第一个元素。
在使用数据集时,通常会将数据集对象传递给DataLoader类,然后使用DataLoader来迭代数据集。在迭代过程中,DataLoader会自动调用Dataset对象的__getitem__方法来获取数据集中的元素,并将这些元素组成一个批次(batch)返回。
同理__len__也不是在对象生成的时候自动调用的。
四、__ len __方法
和前面类似直接上代码:
class MyDataset:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, index):
return self.data[index]
my_dataset = MyDataset([1, 2, 3, 4, 5])
print(len(my_dataset)) # 输出:5
结果:
在上述代码中,其中__len__方法返回了数据集中的样本数量,__getitem__方法用于获取数据集中的单个样本。这样,在使用DataLoader迭代数据集时,DataLoader会自动调用MyDataset对象的__len__方法来获取数据集的长度,以便在迭代过程中确定迭代的次数。