【9.0】Python面向对象之内置方法
【引入】
- Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类
- 这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发
【一】__init__()
,__del__()__
,__new__()
-
Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类
-
这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发
-
这个方法是一个类的构造函数,与之对应的
__del__()
是析构函数,通过此方法我们可以定义一个对象的初始操作。 -
但实际上,新式类的
__new__()
才是真正的初始化函数。
- 既然知道了
__new__()
方法,我们是不是可以考虑一下,如何应用它呢?最常见的就是单例模式了,下面给出实现实例。
【二】__str__
,__repr__
【1】__str__
__str__
方法会在对象被打印时自动触发- print功能打印的就是它的返回值
- 我们通常基于方法来定制对象的打印信息
- 该方法必须返回字符串类型
【2】__repr__
- repr或者交互式解释器触发
【3】小结
- str函数或者print函数--->
obj.__str__()
- repr或者交互式解释器--->
obj.__repr__()
- 如果
__str__
没有被定义,那么就会使用__repr__
来代替输出 - 注意:这俩方法的返回值必须是字符串,否则抛出异常
【三】__del__
方法
-
__del__
会在对象被删除时自动触发。 -
由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制
__del__
方法 -
但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下
- 关于系统资源的回收,Python的垃圾回收机制便派不上用场了
- 需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作
【四】isinstance(obj,cls)
和issubclass(sub,super)
isinstance(obj,cls)
检查是否obj
是否是类cls
的对象
issubclass(sub, super)
检查sub
类是否是super
类的派生类
【五】__doc__
【六】__enter__
和__exit__
- 上述叫做上下文管理协议,即with语句
- 为了让一个对象兼容with语句,必须在这个对象的类中声明
__enter__
和__exit__
方法
-
__exit__()
中的三个参数分别代表-
异常类型
-
异常值
-
追溯信息
-
-
with语句中代码块出现异常,则with后的代码都无法执行
- 如果
__exit__()
返回值为True,那么异常会被清空,就好像啥都没发生一样- with后的语句正常执行
【七】__setattr__
,__delattr__
,__getattr__
【1】方法介绍
-
__getattr__(self, name)
: 访问不存在的属性时调用 -
__setattr__(self, name, value)
:设置实例对象的一个新的属性时调用 -
__delattr__(self, name)
:删除一个实例对象的属性时调用
- 对象属性查找顺序
- 首先访问
__getattribute__()
魔法方法(隐含默认调用,无论何种情况,均会调用此方法 - 去实例对象t中查找是否具备该属性:
t.__dict__
中查找,每个类和实例对象都有一个__dict__
的属性 - 若在
t.__dict__
中找不到对应的属性, 则去该实例的类中寻找,即t.__class__.__dict__
- 若在实例的类中也招不到该属性,则去父类中寻找,即
t.__class__.__bases__.__dict__
中寻找 - 若以上均无法找到,则会调用
__getattr__
方法,执行内部的命令(若未重载__getattr__
方法,则直接报错:AttributeError)
- 首先访问
【2】二次加工标准类型(包装)
(1)包装
- 包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)
(2)授权
-
授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。
-
授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
-
实现授权的关键点就是覆盖
__getattr__
方法
【八】__setitem__
,__getitem__
,__delitem__
__getitem__()
将对象当作list使用- 如obj = ACLASS(), obj_first=obj[0]
【九】__call__
-
对象后面加括号,触发执行。
-
注:构造方法的执行是由创建对象触发的
- 即:对象 = 类名() ;
-
而对于
__call__
方法的执行是由对象后加括号触发的- 即:对象() 或者 类()()
【十】__gt__()
,__lt__()
,__eq__()
,__ne__()
,__ge__()
- 定义对象比较方法,为关系运算符>,>=,<,==等提供接口
- 其实,类似的数值运算的魔法方法非常非常之多,好吧,我真的用了两个,现在是三个非常来形容,以下列出部分
【十一】__iter__()
- 为for … in提供接口,返回一个迭代对象,并调用对象next()方法,直到StopIteration
【十二】描述符(__get__()
,__set__()
,__delete__()
)
【1】什么是描述符
- 描述符本质就是一个新式类,在这个新式类中
- 至少实现了
__get__()
,__set__()
,__delete__()
中的一个 - 这也被称为描述符协议
- 至少实现了
__get__()
:调用一个属性时,触发__set__()
:为一个属性赋值时,触发__delete__()
:采用del删除属性时,触发
【2】描述符的作用
- 描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)
【3】描述符分两种
- 数据描述符:至少实现了
__get__()
和__set__()
__EOF__

本文链接:https://www.cnblogs.com/dream-ze/p/17867258.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17867258.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!