1. 什么是魔法方法?


在Python中,魔法方法(或称为特殊方法)是一种由双下划线(__)包围的方法。它们在类中使用,并具有特殊的名称。魔法方法可以帮助我们定义自定义的行为,以适应特定的操作,例如实例创建、属性访问、算术运算、容器操作等。通过使用魔法方法,我们可以使我们的自定义类行为像内置对象一样。

2. 一些常用的魔法方法


下面是一些常用的魔法方法的例子:

2.1. __init__(self, ...):


__init__魔法方法是在创建一个对象时被自动调用的。它用于初始化对象的属性。

class MyClass:
    def __init__(self, name):
        self.name = name

obj = MyClass("John")

2.2. __str__(self):


__str__魔法方法用于定义一个类的字符串表示形式。当我们使用print函数或str()方法打印一个实例时,Python会自动调用这个方法。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"({self.x}, {self.y})"

p = Point(1, 2)
print(p)  # 输出:(1, 2)

2.3. __add__(self, other):


__add__魔法方法用于定义两个对象相加时的行为。当我们使用加号运算符将两个对象相加时,Python会自动调用这个方法。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2
print(p3.x, p3.y)  # 输出:4 6

3. 其他常用的魔法方法


除了上述提到的魔法方法,Python还提供了许多其他有用的魔法方法,例如:

3.1. __len__(self):


__len__魔法方法用于定义一个对象的长度。当我们使用len()函数计算对象的长度时,Python会自动调用这个方法。

class MyList:
    def __init__(self, data):
        self.data = data
    
    def __len__(self):
        return len(self.data)

my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  # 输出:5

3.2. __getitem__(self, index):


__getitem__魔法方法用于通过索引获取一个对象的元素。当我们使用索引运算符([])获取对象中的元素时,Python会自动调用这个方法。

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[2])  # 输出:3

3.3. __setitem__(self, index, value):


__setitem__魔法方法用于通过索引设置一个对象的元素。当我们使用索引运算符([])设置对象中的元素时,Python会自动调用这个方法。

class MyList:
    def __init__(self, data):
        self.data = data
    
    def __setitem__(self, index, value):
        self.data[index] = value

my_list = MyList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.data)  # 输出:[1, 2, 10, 4, 5]

3.4. __contains__(self, item):


__contains__魔法方法用于检查一个对象是否包含某个元素。当我们使用in运算符检查对象中是否包含某个元素时,Python会自动调用这个方法。

class MyList:
    def __init__(self, data):
        self.data = data
    
    def __contains__(self, item):
        return item in self.data

my_list = MyList([1, 2, 3, 4, 5])
print(3 in my_list)  # 输出:True

这只是一些常用的魔法方法,实际上还有很多其他魔法方法可以用于不同的用途。了解和熟练使用这些魔法方法可以帮助我们更好地编写Python类。