一个偶然的机会,在阅读代码的时候发现了__del__的使用,在网上查了一遍之后,发现有很多有关与python内建的内容我一点都不清楚,现在在这里建立一篇博客,用来集合我对内建模块的理解,随着我的阅读逐渐更新吧
object 新式类的基类,用于被继承的基类,提供了一个类所需要的大部分基础接口
object的基础方法可以通过help(type(object))来获取介绍
对象的常用内建方法(魔术方法):
__init__:继承自object的类会直接拥有这个内部方法,默认内容为pass,在类被创建的时候会调用__init__,可以理解为C的构造函数,只是内存分配之类的活python底层已经完成了,在__init__里需要做的事情是脚本层面对这个类的逻辑初始化,__init__需要一个基础对象self,而self指向的对象是由__new__方法创建出来的,__new__调用在self之前
__del__:继承自object的类不会直接拥有这个方法,需要在外部显式定义,这个方法会在类的引用计数为0之后,自动被调用,可以理解为C的析构函数,用来做一些销毁操作
__call__:用调用类的实例名后执行的接口,CTest()() <==> CTest().__call__(),可以这样理解“人”是一个实例,有一个人叫做“渣渣枫”,“渣渣枫”就是“人”的一个实例,而渣渣枫的__call__接口就是你叫他一声“渣渣枫"之后他会产生的反应,默认是他会回头,如果你重载了__call__为反击,那么他听到你叫他渣渣枫可能会打你一顿,写成程序就是
渣渣枫 = 人()
渣渣枫()
渣渣枫.__call__() # 等价于 渣渣枫()
__str__:重载了对象的这个接口后,用print的方式输出这个对象时,会输出__str__返回的string
__str__这个方法在定义的时候必须返回一个string,否则会报错
另外:x.__str__() <==> str(x),本质上print一个对象就是将该对象用str(x)变成字符串然后输出,print出来的东西只能是字符串
print x <==>print str(x)
__repr__:在__str__的基础上进一步改变对象对外的输出,当直接用python输出该对象,而不是pirnt该对象时,会输出__repr__所返回的字符串,当对象没有定义__str__的时候,print该对象也会输出__repr__返回的字符串,str(object)也是同理,当__str__与__repr__共存时,print输出的会是__str__返回的字符串,同样__repr__也不能返回非字符串类型
__new__:绑定方法,用来创建实例对象本身,在调用类名实例化一个类时会被调用,执行在__init__之前,__init__(self, *args)中的self就是由__new__创建出来的,其底层原理就是调用python底层用C写的PyObject对象生成接口,将必要参数传入,返回该对象的一个引用回来,是后续展开一切对象操作的基础
oTest = CTest.__new__(CSubTest, *args) <==> oTest = CSubTest(*args) # 其中CSubTest是CTest的subtype
除此之外还有一些对应操作符行为的内建接口,可以通过修改这些接口来实现对应操作符的执行过程
x.__and__(y) <==> x&y
x.__or__(y) <==> x|y
x.__xor__(y) <==> x^y
x.__invert__() <==> ~x
x.__abs__() <==> abs(x)
x.__add__(y) <==> x+y
x.__sub__(y) <==> x-y
x.__lshift__(y) <==> x<<y
x.__rshift__(y) <==> x>>y # l和r是左右的意思,反转使用是x.__rrshift__(y)
x.__mul__(y) <==> x*y
x.__div__(y) <==> x/y
x.__mod__(y) <==> x%y # 运算类方法__XXX__在前面加r变成__rXXX__的效果等同于反转x,y的位置,在此不做重复
x.__divmod__(y) <==> divmod(x, y)
x.__pos__() <==> +x
x.__neg__() <==> -x
x.__cmp__(y) <==> cmp(x,y)
x.__nonzero__() <==> x != 0
x.__float__() <==> float(x)
x.__int__() <==> int(x)
x.__long__() <==> long(x)
x.__getattribute__('name') <==> x.name
x.__hash__() <==> hash(x)
/*
有关于python的哈希算法,使用的是一致性哈希
一致性hash介绍:点击打开链接
python哈希的代码实现:点击打开链接
*/
bit_length