浅谈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 相关文章推荐
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
SpringBoot快速入门详解
Jul 21 Java/Android
Java日常练习题,每天进步一点点(38)
Jul 26 Java/Android
使用springMVC所需要的pom配置
Sep 15 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
springboot应用服务启动事件的监听实现
Apr 06 Java/Android
Android 界面一键变灰 深色主题工具类
Apr 28 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 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
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
详解Python中is和==的区别
2019/03/21 Python
pygame实现打字游戏
2021/02/19 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
Prototype如何更新局部页面
2013/03/03 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
应聘教师推荐信
2013/10/31 职场文书
爱心倡议书范文
2014/05/12 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
演讲开场白和结束语
2015/05/29 职场文书