今天一定要洛必达

今天一定要洛必达


前言

参考视频:视频

一、魔术方法

首先看一看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

正常情况下运行代码会报错 无法打印元素:
【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)-LMLPHP

但是稍稍做一些修改,在类内加入特殊方法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

【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)-LMLPHP

在学深度学习的时候一直有个疑问:在生成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

结果:
【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)-LMLPHP

在上述代码中,其中__len__方法返回了数据集中的样本数量,__getitem__方法用于获取数据集中的单个样本。这样,在使用DataLoader迭代数据集时,DataLoader会自动调用MyDataset对象的__len__方法来获取数据集的长度,以便在迭代过程中确定迭代的次数。

04-15 10:06