python内建函数探析

本文详细介绍了Python中魔术方法的基本概念及应用,包括__init__、__del__、__call__、__str__、__repr__等方法的作用及区别,并解释了如何通过重载这些方法来定制对象的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一个偶然的机会,在阅读代码的时候发现了__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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值