Python中的魔术方法(Magic Methods)是指以双下划线开头和结尾的特殊方法。这些方法在类被调用时会自动触发,可以对其进行重写来改变默认行为或添加额外功能。
以下是常用的一些魔术方法及其作用:
__init__
:构造函数,当创建新对象时自动调用。通过该方法可以初始化对象的属性。
__str__
:返回对象的字符串表示形式。当使用print语句打印对象时,将调用此方法获取输出内容。
__repr__
:与__str__
相似,也是返回对象的字符串表示形式。不同之处在于__repr__
应该提供更多关于对象状态的信息。
__len__
:返回对象的长度。当使用len()函数计算对象的长度时,将调用此方法。
__getitem__
、__setitem__
、__delitem__
:分别用于索引操作(如obj[key])、设置值操作(如obj[key]=value)和删除元素操作(如del obj[key])。
__call__
:使得对象可以像函数一样被调用。当对象后面加上小括号并传入参数时,将调用此方法。
__add__
、__sub__
等:用于支持运算符重载,比如+、-、*、/等。
__eq__
、__ne__
、__lt__
、__gt__
、__le__
、__ge__
:用于支持比较运算符重载,比如==、!=、<、>、<=、>=等。
__iter__
、__next__
:用于支持迭代器接口,使得对象可以被for循环遍历。
以下是一个自定义类的例子,展示了如何重写部分魔术方法:
class MyClass:
def __init__(self):
self.data = []
# 重写__str__方法,返回对象的字符串表示形式
def __str__(self):
return f"MyClass object with data {self.data}"
# 重写__len__方法,返回对象的长度
def __len__(self):
return len(self.data)
# 重写__getitem__方法,支持索引操作
def __getitem__(self, key):
if isinstance(key, int):
return self.data[key]
else:
raise TypeError("Invalid index type")
# 测试自定义类
my_object = MyClass()
my_object.data = [1, 2, 3, 4, 5]
print(my_object) # 输出:MyClass object with data [1, 2, 3, 4, 5]
print(len(my_object)) # 输出:5
print(my_object[0]) # 输出:1