Python 魔法方法解析(python中魔术方法)
off999 2024-11-15 23:07 14 浏览 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
相关推荐
- PYTHON-简易计算器的元素介绍
-
[烟花]了解模板代码的组成importPySimpleGUIassg#1)导入库layout=[[],[],[]]#2)定义布局,确定行数window=sg.Window(...
- 如何使用Python编写一个简单的计算器程序
-
Python是一种简单易学的编程语言,非常适合初学者入门。本文将教您如何使用Python编写一个简单易用的计算器程序,帮助您快速进行基本的数学运算。无需任何高深的数学知识,只需跟随本文的步骤,即可轻松...
- 用Python打造一个简洁美观的桌面计算器
-
最近在学习PythonGUI编程,顺手用Tkinter实现了一个简易桌面计算器,功能虽然不复杂,但非常适合新手练手。如果你正在学习Python,不妨一起来看看这个项目吧!项目背景Tkint...
- 用Python制作一个带图形界面的计算器
-
大家好,今天我要带大家使用Python制作一个具有图形界面的计算器应用程序。这个项目不仅可以帮助你巩固Python编程基础,还可以让你初步体验图形化编程的乐趣。我们将使用Python的tkinter库...
- 用python怎么做最简单的桌面计算器
-
有网友问,用python怎么做一个最简单的桌面计算器。如果只强调简单,在本机运行,不考虑安全性和容错等的话,你能想到的最简单的方案是什么呢?我觉得用tkinter加eval就够简单的。现在开整。首先创...
- 说好的《Think Python 2e》更新呢!
-
编程派微信号:codingpy本周三脱更了,不过发现好多朋友在那天去访问《ThinkPython2e》的在线版,感觉有点对不住呢(实在是没抽出时间来更新)。不过还好本周六的更新可以实现,要不就放一...
- 构建AI系统(三):使用Python设置您的第一个MCP服务器
-
是时候动手实践了!在这一部分中,我们将设置开发环境并创建我们的第一个MCP服务器。如果您从未编写过代码,也不用担心-我们将一步一步来。我们要构建什么还记得第1部分中Maria的咖啡馆吗?我们正在创...
- 函数还是类?90%程序员都踩过的Python认知误区
-
那个深夜,你在调试代码,一行行检查变量类型。突然,一个TypeError错误蹦出来,你盯着那句"strobjectisnotcallable",咖啡杯在桌上留下了一圈深色...
- 《Think Python 2e》中译版更新啦!
-
【回复“python”,送你十本电子书】又到了周三,一周快过去一半了。小编按计划更新《ThinkPython2e》最新版中译。今天更新的是第五章:条件和递归。具体内容请点击阅读原文查看。其他章节的...
- Python mysql批量更新数据(兼容动态数据库字段、表名)
-
一、应用场景上篇文章我们学会了在pymysql事务中批量插入数据的复用代码,既然有了批量插入,那批量更新和批量删除的操作也少不了。二、解决思路为了解决批量删除和批量更新的问题,提出如下思路:所有更新语...
- Python Pandas 库:解锁 combine、update 和compare函数的强大功能
-
在Python的数据处理领域,Pandas库提供了丰富且实用的函数,帮助我们高效地处理和分析数据。今天,咱们就来深入探索Pandas库中四个功能独特的函数:combine、combine_fi...
- 记录Python3.7.4更新到Python.3.7.8
-
Python官网Python安装包下载下载文件名称运行后选择升级选项等待安装安装完毕打开IDLE使用Python...
- Python千叶网原图爬虫:界面化升级实践
-
该工具以Python爬虫技术为核心,实现千叶网原图的精准抓取,突破缩略图限制,直达高清资源。新增图形化界面(GUI)后,操作门槛大幅降低:-界面集成URL输入、存储路径选择、线程设置等核心功能,...
- __future__模块:Python语言版本演进的桥梁
-
摘要Python作为一门持续演进的编程语言,在版本迭代过程中不可避免地引入了破坏性变更。__future__模块作为Python兼容性管理的核心机制,为开发者提供了在旧版本中体验新特性的能力。本文深入...
- Python 集合隐藏技能:add 与 update 的致命区别,90% 开发者都踩过坑
-
add函数的使用场景及错误注意添加单一元素:正确示例:pythons={1,2}s.add(3)print(s)#{1,2,3}错误场景:试图添加可变对象(如列表)会报错(Pytho...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)