Skip to main content

魔术方法列表

官方列表

image-20221017220856046

魔术方法

名称作用使用场景
__init__对象的构造方法
__new__构造方法
__del__
__call__
__len__
__doc__类的文档(字符串)当类被用作打印对象时
__bases__类的所有父类租车的元素
__dict__类的属性列表(字典)
__modlue__类所属的模
__class__类对象的类型
__author__
__slots__限制从外部绑定新的属性,
__dict__
__dir__
__getitem__
__add__
__radd__当左边没有实现add属性时,看右边又没有radd属性,如有右边又radd属性则调用此属性进行右加两个对象相加时

__init__()

触发机制:实例化对象之后立即触发
参数:至少有一个self,接收当前对象,其他参数根据需要进行定义
返回值:无
作用:初始化对象的成员

__new__()

触发时机: 实例化对象时自动触发(在__init__之前触发)
参数:至少一个cls 接收当前类,其他参数根据初始化方法参数决定
返回值:必须返回一个对象实例,没有返回值,则实例化对象的结果为None
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。

__del__

触发时机:当该类对象被销毁时,自动触发
参数:一个self,接受当前对象
返回值:无
作用:关闭或释放对象创建时资源
注意:del不一定会触发当前方法,只有当前对象没有任何变量引用时才会触发

__call__

调用对象的魔术方法
触发时机:将对象当作函数调用时触发,方式: 对象()
参数:至少一个self接收对象,其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无

__len__

触发时机:使用len(对象) 的时候触发
参数:一个参数self
返回值:必须是一个整型
作用:可以设置为检测对象成员个数,但是也可以进行其他任意操作
注意:返回值必须必须是整数,否则语法报错,另外该要求是格式要求。

__str__

触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
注意:无

__repr__

触发时机:
在使用repr(对象)的时候触发
被print打印时
参数:一个self接收对象
返回值:必须是字符串
作用:将对象转使用repr化为字符串时使用,也可以用于快捷操作

__bool__

触发时机: 使用bool(对象)的时候触发
参数:一个self接收对象
返回值:必须是布尔值
作用:根据实际情况决定,可以作为快捷方式使用
注意:仅适合于返回布尔值的操作

__format__

触发时机:使用字符串.format(对象)时候触发
参数:一个self接收对象,一个参数接收format的{}中的格式,例如:>5
返回值:必须是字符串
作用:设置对象可以作为format的参数,并且自定义对象格式化的规则
注意:无

__getattr__

触发时机:获取不存在的对象成员时触发
参数:一个是接收当前对象的self,一个是获取成员名称的字符串
返回值:必须有值
作用:为访问不存在的属性设置值
注意:getattribute无论何时都会在getattr之前触发,触发了getattribute就不会在触发getattr了

__setattr__

触发时机:设置对象成员值的时候触发
参数:1个当前对象的self,一个是要设置的成员名称字符串,一个是要设置的值
返回值:无 过程操作
作用:接管设置操作,可以在设置前之前进行判断验证等行为
注意:在当前方法中无法使用成员=值的方式直接设置成员,否则会无限递归,必须借助object的设置方法来完成

object.__setattr__(参数1,参数2,参数3)

__delattr__

触发时机:删除对象成员时触发
参数:一个当前对象的self
返回值:无
作用:可以在删除成员时进行验证。

__getattribute__

触发时机:使用对象成员时触发,无论成员是否存在
参数:1个接收当前对象self,一个是获取的成员的名称字符串
返回值:必须有
作用:在具有封装操作(私有化时),为程序开部分访问权限使用

__dir__

触发时机:dir(对象)的时候触发
参数:1个接收当前对象self
返回值:必须为序列类型(列表,元组,集合等,)
作用:可以自定义成员列表的返回值

__slot__()

通过__slot__设定属性后,实例就再无__dict__字典属性了,因此实例的属性只能从槽位中获取,就是网络硬件板块槽位思想一致。

__eq__()__ne__()

它们两者是成对出现的

eq()对于两个非常基本(且没用)的类 A 和 B 的编码

class A(object):
def __init__(self, value):
self.value = value

def __eq__(self, other):
if isinstance(other, A):
print('Comparing an A with an A')
return other.value == self.value
if isinstance(other, B):
print('Comparing an A with a B')
return other.value == self.value
print('Could not compare A with the other class')
return NotImplemented # 此处用于返回

class B(object):
def __init__(self, value):
self.value = value

def __eq__(self, other):
if isinstance(other, B):
print('Comparing a B with another B')
return other.value == self.value
print('Could not compare B with the other class')
return NotImplemented
>>> from example import A, B
>>> a1 = A(1)
>>> b1 = B(1)

__add__()__radd__()

使用场景

class A:
def __init__(self, name, age=20):
self.name = name
self.age = age

def __add__(self, other):
self.age += other.age
return self

def __iadd__(self, other):
return A(self.name,self + other)

def __radd__(self, other):
if hasattr(other,'age'):
return A(self.age + other.age)
else:
try:
x = int(other)
except:
x = 100
self.age = self.age + x
return self.age

tom = A('tom')
print('ss' + tom) # 因为字符串没有add方法,所以调用tom的右侧radd,进行计算

# 运行结果: 120