python之魔术方法总结

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 魔术方法进行了一个简单的总结,以帮助读者更好地理解和应用这些方法。

魔术方法的使用可以让对象更加易于操作,遵循一些约定俗成的方法名可以大幅提升代码的可读性。但是,魔术方法的使用也需要适度,过度使用可能会导致代码的难以维护和理解。

后端开发标签