浅谈Python魔法方法


Posted in Java/Android onJune 28, 2021

特殊方法一览

浅谈Python魔法方法

在 Python 的学习和使用过程中, 你一定碰到过一些 特殊方法, 它们开头和结尾都有两条下划线, 也叫魔法方法 (Magic method), 或者 Dunder method (double under method).

例如:

>>> dir(int)
['__abs__', '__add__', '__and__', 
'__bool__', '__ceil__', '__len__', 
'__delattr__', '__dir__', '__divmod__', 
'__doc__', '__eq__', '__float__', ...]

* Python 的内置数据类型实现了非常多的魔法方法, 可以通过 dir() 进行查看.

初识魔法方法

当我们想从一个数组 nums = [1, 2, 3] 中获取第一个元素, 我们知道只需要执行 nums[0] 即可, 为了求得 nums[0] 的值, Python 的编译器实际上会隐式调用 nums.__getitem__(0)

>>> nums = [1, 2, 3]
>>> nums[0]
1
>>> nums.__getitem__(0)
1

再例如获取数组的长度, 我们使用 len(nums) 来获取, Python 编译器也是调用了特殊方法 nums.__len__()

>>> len(nums)
3
>>> nums.__len__()
3
  • 特殊方法的存在是给 Python 编译器隐式调用的
  • 我们自己写程序的时候不需要调用
  • 它从规范上, 不可以自己定义类似 _ _xx_ _ 的方法

魔法方法有什么作用

运算符重载

在 Python 中 + 可以对两个 int 类型的数据进行加操作, 也可以对字符串进行拼接, 这都是魔法方法在背后保证了整体语言风格的一致性.

魔法方法被大量用在运算符重载方面, 比如 +, -, * , /的操作. 我们自己可以定义想要的数据结构或者数据类型, 这些自定义的class可以跟 Python 内置的数据类型一样, 从而可以写出更具表达力的代码, 换句话说就是更具有 Pythonic 风格的代码.

动手实践

下面我们自定义一个叫工具人的类, 让这个类支持加法, 乘法, 大于等于等操作

class ToolMan(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __len__(self):
        return len(self.name)

    def __str__(self):
        return "你好, 打工人!"

    def __add__(self, other):
        # 将两个ToolMan的年龄加起来
        return self.age + other.age

    def __mul__(self, other):
        # 将两个 ToolMan 的年龄相乘
        return self.age * other.age

    def __ge__(self, other):
        # 对比连个 ToolMan 的年龄
        return self.age >= other.age

我们自定义了这样一个类, 你可以发现类中重写了很多魔法方法, 这些魔法方法可以让你自定义的类也实现类似 interger 的加减乘除, 比较大小等操作!

>>> tool_man1 = ToolMan("打工人1", 20)
>>> tool_man2 = ToolMan("打工人2", 25)
>>> print(tool_man1)
你好, 打工人!
>>> tool_man1 + tool_man2
45
>>> tool_man1 * tool_man2
500
>>> tool_man1 >= tool_man2
False

是不是还挺有意思的, 自己动手玩一玩吧~

到此这篇关于浅谈Python魔法方法的文章就介绍到这了,更多相关Python魔法方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Apr 08 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
Java数据结构之堆(优先队列)
May 20 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 Java/Android
Java实现二维数组和稀疏数组之间的转换
深入理解java.lang.String类的不可变性
springboot拦截器无法注入redisTemplate的解决方法
Java中PriorityQueue实现最小堆和最大堆的用法
探讨Java中的深浅拷贝问题
解决SpringBoot跨域的三种方式
Jun 26 #Java/Android
分析Java中Map的遍历性能问题
Jun 26 #Java/Android
You might like
一些星际专用术语解释
2020/03/04 星际争霸
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP中比较时间大小实例
2014/08/21 PHP
php中执行系统命令的方法
2015/03/21 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
python分割和拼接字符串
2013/11/01 Python
朴素贝叶斯算法的python实现方法
2014/11/18 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
Java中实现多态的机制是什么?
2014/12/07 面试题
教师国庆节演讲稿范文2014
2014/09/21 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
学习党史心得体会2016
2016/01/23 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python
golang定时器
2022/04/14 Golang