1. 前言
在python编程中,魔术方法(也称为特殊方法或者双下划线方法)是很重要的一部分。魔术方法是一种特殊的函数,可以在使用特殊语法时进行调用,而不需要显示调用。它们的名称由两个下划线字符开头和结尾,例如 __init__()。
魔术方法负责类的初始化、属性的访问、比较、运算、转换等一系列操作。在本文中,我们将对一些常见的魔术方法进行总结,希望能够帮助大家更好地理解和使用这些方法。
2. __init__方法
__init__方法是在创建对象时调用的方法,用于初始化实例对象的属性。它的第一个参数通常都是self,代表当前实例对象。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('Tom', 24)
print(p.name) # 输出'Tom'
2.1 __new__方法
__new__方法是在对象实例化时调用的方法,用于创建并返回一个新的实例对象(即构造方法)。
与__init__方法不同,__new__方法是一个类方法,第一个参数是cls,代表当前类的对象。
class MyList:
def __new__(cls, *args, **kwargs):
print('调用__new__方法')
lst = super().__new__(cls)
return lst
def __init__(self, *args, **kwargs):
print('调用__init__方法')
mylist = MyList()
3. __str__方法
__str__方法是在调用str()或print()函数时自动调用的方法,用于返回描述对象的字符串。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Person({self.name}, {self.age})'
p = Person('Tom', 24)
print(p) # 输出'Person(Tom, 24)'
4. __repr__方法
__repr__方法是在交互式环境下直接输入对象名或调用repr()函数时自动调用的方法,用于返回对象的字符串表示(通常包括用于创建该对象的代码)。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person('{self.name}', {self.age})"
p = Person('Tom', 24)
print(p) # 输出"Person('Tom', 24)"
5. __getitem__和__setitem__方法
__getitem__方法是在使用索引访问对象时自动调用的方法,用于返回指定索引的值。
与之相反的是__setitem__方法,是在给对象的指定索引赋值时自动调用的方法。
class MyList:
def __init__(self, *args):
self.lst = list(args)
def __getitem__(self, index):
return self.lst[index]
def __setitem__(self, index, value):
self.lst[index] = value
mylist = MyList(1, 2, 3)
print(mylist[1]) # 输出2
mylist[1] = 0
print(mylist[1]) # 输出0
6. __len__方法
__len__方法是在使用len()函数时自动调用的方法,用于返回对象的长度或元素个数。
class MyList:
def __init__(self, *args):
self.lst = list(args)
def __len__(self):
return len(self.lst)
mylist = MyList(1, 2, 3)
print(len(mylist)) # 输出3
7. __getattr__和__setattr__方法
__getattr__方法是当试图访问不存在的属性时自动调用的方法,用于返回一个默认值或抛出异常。
与之相反的是__setattr__方法,是在给对象的属性赋值时自动调用的方法。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getattr__(self, name):
return f'{name}属性不存在'
def __setattr__(self, name, value):
print(f'设置{name}属性为{value}')
super().__setattr__(name, value)
p = Person('Tom', 24)
print(p.gender) # 输出 'gender属性不存在'
p.age = 25 # 输出 '设置age属性为25'
8. __lt__和__gt__方法
__lt__方法是在进行“小于”比较运算时自动调用的方法,用于返回True或False。
与之相反的__gt__方法是在进行“大于”比较运算时自动调用的方法。
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def __lt__(self, other):
return self.score < other.score
s1 = Student('Tom', 24, 80)
s2 = Student('Jerry', 22, 90)
print(s1 < s2) # 输出 True
9. __call__方法
__call__方法是在使用函数调用对象时自动调用的方法,用于让对象的行为类似于函数。
class MyAdder:
def __init__(self, value):
self.value = value
def __call__(self, x):
return self.value + x
add_2 = MyAdder(2)
print(add_2(3)) # 输出5
10. 总结
本文对常见的 python 魔术方法进行了一个简单的总结,以帮助读者更好地理解和应用这些方法。
魔术方法的使用可以让对象更加易于操作,遵循一些约定俗成的方法名可以大幅提升代码的可读性。但是,魔术方法的使用也需要适度,过度使用可能会导致代码的难以维护和理解。