在 Python 中,类可以通过实现一些特殊方法(也称为魔术方法或双下划线方法)来重载内置操作符和函数。这些方法以双下划线开头和结尾,例如 __len__
、__getitem__
等。它们使得类的实例能够像内置类型那样使用。
__len__
__len__
方法定义了当使用 len()
函数时应返回的值。
原理:
- 当你对一个对象调用
len(obj)
时,Python 会调用该对象的__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
__getitem__
__getitem__
方法定义了当使用索引访问对象元素时应返回的值。
原理:
- 当你使用
obj[key]
访问对象时,Python 会调用该对象的__getitem__
方法。 - 常用于实现序列(如列表)或映射(如字典)的行为。
用法:
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
# 示例
my_list = MyList([10, 20, 30, 40, 50])
print(my_list[2]) # 输出 30
__setitem__
__setitem__
方法定义了当使用索引设置对象元素时的行为。
原理:
- 当你使用
obj[key] = value
赋值时,Python 会调用该对象的__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([10, 20, 30, 40, 50])
my_list[2] = 99
print(my_list[2]) # 输出 99
__delitem__
__delitem__
方法定义了当使用 del
语句删除对象元素时的行为。
原理:
- 当你使用
del obj[key]
删除元素时,Python 会调用该对象的__delitem__
方法。
用法:
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
def __delitem__(self, index):
del self.data[index]
# 示例
my_list = MyList([10, 20, 30, 40, 50])
del my_list[2]
print(my_list.data) # 输出 [10, 20, 40, 50]
__iter__
和 __next__
__iter__
和 __next__
方法定义了对象的迭代行为,使对象可以被迭代器(如 for
循环)使用。
原理:
__iter__
方法返回迭代器对象本身。__next__
方法返回序列的下一个值。如果没有更多的值,则抛出StopIteration
异常。
用法:
class MyList:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 示例
my_list = MyList([10, 20, 30, 40, 50])
for item in my_list:
print(item)
__repr__
和 __str__
__repr__
和 __str__
方法定义了对象的字符串表示。
原理:
__repr__
方法返回一个字符串,该字符串应尽可能准确且唯一,以便开发人员理解。它用于repr()
函数和交互式解释器中。__str__
方法返回一个字符串,该字符串是对象的可打印表示形式。它用于str()
函数和print()
语句中。
用法:
class MyList:
def __init__(self, data):
self.data = data
def __repr__(self):
return f"MyList({self.data})"
def __str__(self):
return f"MyList with data: {self.data}"
# 示例
my_list = MyList([10, 20, 30, 40, 50])
print(repr(my_list)) # 输出 MyList([10, 20, 30, 40, 50])
print(my_list) # 输出 MyList with data: [10, 20, 30, 40, 50]