魔术方法列表
魔术方法
名称 | 作用 | 使用场景 |
---|---|---|
__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