Python双下划线

简介
在Python中,双下划线(__)被广泛用于不同的情境和用途。这些双下划线在Python中被称为魔法方法(Magic Methods)或特殊方法(Special Methods)。
魔法方法是Python中的一种语法规定,它们用于在特定的情况下,自动地调用某些特定的操作,从而提供更加具体和灵活的控制。通过使用双下划线,我们可以自定义类的行为,使其表现得像Python内置类型一样。
在本文中,我们将详细讨论Python中一些常用的魔法方法,并展示它们的应用。
__init__ – 初始化方法
__init__ 是魔法方法中最常见和最广泛使用的一个。当创建一个类的实例时,__init__ 方法会被自动调用,用于进行对象的初始化操作。
示例代码:
class Person:
def __init__(self, name):
self.name = name
person = Person("Alice")
print(person.name) # 输出:Alice
在上面的代码中,我们定义了一个 Person 类,它有一个参数为 name 的 __init__ 方法。在创建 Person 类的实例时,我们传入一个名字,并将其赋值给实例的 name 属性。最后,我们打印出了 name 属性的值,即 Alice。这说明 __init__ 方法成功地对实例进行了初始化。
__str__ – 字符串表示方法
__str__ 方法用于返回一个对象的字符串表示。当使用 print 函数或 str 函数时,会自动调用该方法。
示例代码:
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person(name={self.name})"
person = Person("Alice")
print(person) # 输出:Person(name=Alice)
在上面的代码中,我们定义了一个 __str__ 方法。该方法返回了一个字符串,其中包含了实例的名字。当我们使用 print 函数打印 person 对象时,就会自动调用 __str__ 方法并打印返回的字符串。
__len__ – 长度方法
__len__ 方法用于返回一个对象的长度。当使用 len 函数时,会自动调用该方法。
示例代码:
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
在上面的代码中,我们定义了一个 MyList 类,它有一个名为 data 的属性。我们重写了 __len__ 方法,并在其中返回了 data 的长度。当我们使用 len 函数计算 my_list 对象的长度时,就会自动调用 __len__ 方法并返回结果。
__add__ – 加法方法
__add__ 方法用于定义两个对象相加的行为。当使用 + 运算符时,会自动调用该方法。我们可以利用这个特性,使得我们自定义的类能够支持加法操作。
示例代码:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(f"({v3.x}, {v3.y})") # 输出:(4, 6)
在上面的代码中,我们定义了一个 Vector 类,它有两个属性 x 和 y。我们重写了 __add__ 方法,在其中进行了向量的相加操作,并返回了一个新的 Vector 对象。当我们执行 v1 + v2 时,就会自动调用 __add__ 方法并返回结果。
__getitem__ 和 __setitem__ – 索引和赋值方法
__getitem__ 方法用于获取对象中指定索引的元素,__setitem__ 方法用于设置对象中指定索引的元素。我们可以通过重写这两个方法,使得我们自定义的类能够支持索引访问和赋值操作。
示例代码:
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
def __setitem__(self, index, value):
self.data[index] = value
my_list = MyList([1, 2, 3, 4, 5])
print(my_list[2]) # 输出:3
my_list[2] = 7
print(my_list[2]) # 输出:7
在上面的代码中,我们定义了一个 MyList 类,它有一个名为 data 的属性。我们重写了 __getitem__ 和 __setitem__ 方法,分别用于获取和设置 data 中指定索引的元素。当我们执行 my_list[2] 时,就会自动调用 __getitem__ 方法并返回结果。当我们执行 my_list[2] = 7 时,就会自动调用 __setitem__ 方法并进行赋值操作。
__call__ – 调用方法
__call__ 方法用于使对象能够像函数一样被调用。当我们使用对象名加括号的方式调用对象时,会自动调用 __call__ 方法。
示例代码:
class Adder:
def __call__(self, a, b):
return a + b
add = Adder()
result = add(3, 5)
print(result) # 输出:8
在上面的代码中,我们定义了一个 Adder 类,并在其中重写了 __call__ 方法。当我们执行 add(3, 5) 时,就会自动调用 __call__ 方法并返回结果。
总结
本文介绍了Python中双下划线的使用,讨论了一些常用的魔法方法,并展示了它们的应用。通过合理地使用双下划线,我们可以为自定义的类添加更多的功能和灵活性,使其表现得像Python内置类型一样。
极客笔记