Python 魔法方法解析(python中魔术方法)
off999 2024-11-15 23:07 18 浏览 0 评论
前言
在Python语言中,一切皆为对象,因此Python是支持面向对象的高级编程语言。在Python面向对象编程特性 一文中,Python语言是支持封装、继承、多态三个特性的。
- 封装:使用黑盒的方式将对象信息隐藏在内部,外部无法进行访问
- 继承:子父类概念,将父类称为基类,子类可以继承所有父类的特性,极大地提高代码的复用性
- 多态:指向同一个方法,不同对象产生行为是不同的。继承和方法重写是多态的两个前提
在创建类的时候,我们总会调用系统以"__"双下换线开头结尾的方法,来对对象进行创建、初始化、销毁等操作,如以下栗子:
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
print("系统销毁对象{0}".format(self))
复制代码在上述栗子中,我们都知道__init__()是构造方法、__del__()是析构方法,__new__()创建实例对象,除此之外它们还有一个统一的名称叫做魔法方法。
本期,我们将学习Python中拥有一个很帅气的名称魔法方法,Let's go~~
1. 魔法方法概述
- 什么叫魔法方法?
在Python中,定义以"__"双下划线开头结尾的方法,行内内部大家都统称为“magic method”。
比如我们常见的构造方法、析构方法都是属于魔法方法中。
在Python官方文档中,魔法方法分布比较分散,并且介绍时也无案例说明,通常晦涩难懂。
- 魔法方法的特点 魔法方法主要定义类对象的方法,无法直接调用 默认情况,Python解释器会自动调用。特殊情况,可重写该方法。 魔法方法可用于对象初始化、控制属性访问、创建自定义等操作 魔法方法包提供包含如比较、数值计算、单双目运算、类型转换等方法
2. 构造销毁方法
我们上述创建一个Student类,定义一个实例化类StudentA,看看Python解释器内部会分别调用三个魔法方法。
- __new__():是对象实例化时,首先会调用该方法,创建实例,并把类参数name,age传给__init__()。如果__new__()未返回一个类实例,则__init__()方法将不执行。
- __init__():在__new__()创建实例后,对实例化参数进行初始化赋值。因为,对象是由__new__() 创建和 __init__() 定制,共同构建完成的,__init__()返回值为None,否则在运行时会引发TypeError.
- __del__():在实例对象比销毁时被调用。对象被垃圾回收时才会调用该方法,需要注意的是Python解释器退出时,但对象仍然存活的时候,__del__()不会被执行的。如在程序中需要销毁对象,建议尽量手工调用del()方法进行清理。
3. 属性访问方法
Python 魔法方法提供控制属性访问的方法。
- __getattr__(self,name): 该方法用于访问对象不存在的属性时,会调用定义访问行为。这个方法适合于普通的拼写错误的获取和重定向,对获取不建议的属性时会给出警告或者处理一个AttributteError。
- __setattr__(self,name,value): 是封装属性,无论属性是否存在,都允许定义对属性的赋值行为,可以对属性的值进行个性化定义。在使用__setattr__(self,name,value)时,需要避免无限递归的错误。
- __delattr__():与__setattr__(self,name,value)类似,但是不对属性进行赋值而是进行删除。该方法仅在del obj.name 对于对象有意义时才被实现。同样在实现时,需要避免无限循环的错误。
4. 上下文管理器
Python中对文件打开、关闭操作。提供了with 语句,其实质就是运行上下文管理器,由三部分组成。
- 上下文管理协议
- 上下文管理器
- 上下文运行时
以上三部分,其中上下文管理协议是由 __enter__() 和 __exit__() 两个方法相互协作完成的。
- __enter__():进入运行时上下文并返回此对象关联到该运行时上下文的其他对象上。__enter__()该方法的返回值会绑定到使用上下文管理器with语句的as 子句中的标识符。
- __exit__(): 退出运行时上下文并返回一个bool标识的异常是否应当被屏蔽。当with语句体重发生异常,则参数会包含异常类型、值和回溯信息,否则三个参数都是None。
5. 对象描述器
python 魔法方法提供了描述器,是可以通过获取、设置以及删除时访问类。
- 描述器不是独立的,需要被所有者持有,并且存在其字典中
- 当创建面向对象的数据库或者类,里面包含相互依赖的属性时,描述器将会非常有用的
- 实现描述器时,一个类至少有__get__()、__set__()、__delete__()方法
__get__(self,instance,owner):定义描述器的值被取得时的行为。instance 是拥有该描述器对象的一个实例。owner 拥有者本身
__set__(self,instance,value): 定义描述器的值被改变时的行为。instance为描述器的一个实例,value要设置的值。
__delete__(self,instance):定义描述器的值被上传时的行为,instance为描述器的一个实例。
6. 其他方法
- 比较操作符魔法方法:
方法 | 说明 |
__cmp__(self,other) | 比较方法里最基本的魔法方法 |
__eq__(self,other) | 定义相等符号,== |
__ne__(self,other) | 定义不等于符号,!= |
__lt__(self,other) | 定义小于符号,< |
__gt__(self,other) | 定义大于符号,> |
__le__(self,other) | 定义小于等于符号,<= |
__ge__(self,other) | 定义大于等于符号,>= |
____(self) | |
____(self) |
- 单目操作符魔法方法:
方法 | 说明 |
__pos__(self) | 实现取正操作 |
__neg__(self) | 实现取负操作 |
__adbs__(self) | 实现绝对值操作 |
__invert__(self) | 实现取反操作 |
__round__(self,n) | 实现内建函数 |
__floor__(self) | 实现向下取整 |
__ceil__(self) | 实现向上取整 |
__trunc__(self) | 实现距离零最近的的整数 |
总结
本期,主要对Python 魔法方法进行详细的学习。在日常工作,我们可以使用Python 魔法方法方便我们快速进行面向对象编程。
以上是本期内容,欢迎大佬们点赞评论,下期见~
作者:盆友圈的小可爱
链接:https://juejin.cn/post/7063686311000948772
相关推荐
- 笔记本突然开不了机了是什么情况
-
1.检查笔记本是否有电,当内置电池用完而又没有充电的情况下,会导致笔记本无法开机,插上电源充电即可。2.内置电池损坏维修更换即可。3.开机时按F8,在高级选项中选择最后一次正确的配置即可。4.中病毒可...
- windows11办公软件(windows11的office)
-
1、首先点击电脑底部的Windows图标2、进入开始页面点击office套件中的任意应用,如Word3、页面弹出登录按钮,和创建按钮,如已有账号,点击登录4、接着进入激活office页面,输入offi...
-
- 7z文件怎么打开(7z文件改什么后缀才能打开)
-
7z是一种压缩格式,和我们在Windows平台上看到的rar类似;7z原本是7-zip开源的压缩文件所支持的压缩格式,目前大多数压缩软件也支持打开,如若安装了第三方压缩软件双击即可打开7z。7z文件的打开方式介绍如下: 1、扩展名为...
-
2025-11-18 02:03 off999
- 重装系统后连不上网(重装系统后无法连网)
-
1、首先,在安装系统完成之后,界面右下角网络连接显示不可用?我们需要通过,系统本身自带的诊断系统进行诊断,以避免是否是物理原因造成的网络不能正常链接。2、其次,检测结果如果是显示的未能安装网络适配器,...
- 破解wifi密码有什么办法(破解wifi密码有什么办法幻影)
-
破解路由器admin管理员密码方法:只能间接的破解。 方法一、1、打开浏览器---输入192.168.1.1(一般路由器地址是这个或者查看路由器背面的登录信息)进路由---输入用户名,密码...
- 电脑截屏如何截屏(电脑截屏截屏用哪个键)
-
1、直接点击键盘上的PrtScSysRq,即可截图,然后直接在聊天框或者图画中“Ctrl+V”粘贴就行了。2、登录QQ以后,点击快捷键“Ctrl+Alt+A”即可截图,框选过后,直接“...
- 迅捷路由器登录(yr1900g路由器登录入口)
-
入口如下:1.打开网页后输入192.168.1.1或tplogin.cn。2.第一次登录路由器或恢复出厂设置后再次设置,按提示设置好管理员密码、上网参数、wifi名称和密码。3.再次进入登录页面中,输...
- pdf格式怎么编辑(怎么创建pdf格式的文件)
-
1、电脑打开PDF文件。2、电脑打开PDF文件后,点击工具栏中的编辑。3、进入编辑页面后,可以点击文字,对pdf文件进行编辑。4、点击裁剪页面选项,就可以对PDF文件中的页面大小进行裁剪。5、PDF文...
- 电脑显示器不亮(电脑显示器不亮了)
-
多种原因:1、检查电脑主机与显示器之间的连接是否松动、损坏,显示器是否正常。2、这是最常见的故障,内存条接触不良导致显示器无信号。解决办法:断电/拔出内存条,用橡皮擦将金手指擦亮再装回去即可。3、显卡...
- 电脑频繁总自动关机(电脑经常性自动关机)
-
电脑总是自动关机原因如下 1、原因一:设置的问题 有的用户会在电脑上安装管家类软件,这些软件里会有一些设置预定时间关机的功能,比如设置为17:00关机,那么到了下午5点后它就会自动关机,一般检查一...
- 邮箱注册百度账号(邮箱注册百度帐号)
-
要使用邮箱注册天翼云盘,首先需要打开天翼云盘的官方网站。在注册页面中,选择使用邮箱注册并输入您的邮箱地址。然后,按照提示填写您的个人信息,包括用户名、密码等等。最后,点击注册按钮,等待验证邮件的发送。...
- 台式电脑截屏键快捷方式(台式电脑的截图快捷键在哪)
-
方法/步骤1第一个办法自然是我们最常见最简单的,使用“PrintScreen”键截图了。点击“PrintScreen”键,我们就可以直接截取全部屏幕,找个对话框或者文字区域粘贴就好了。我截的图是这样的...
- cad2014密钥001f1不对(cad2014密钥001f1无效)
-
Excel中序号要想输成001,我们可以进行如下的操作,我们先将所有输入序号的这一列全部选定,也就是点击英文字母这一列就可以全部选定了,然后我们在这个选定的区域的状拍下去,点击鼠标右键,再点击数值,再...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
