浅谈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异步之call future
Jun 14 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Java Dubbo框架知识点梳理
Jun 26 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Java 常见的限流算法详细分析并实现
Apr 07 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
Android开发实现极为简单的QQ登录页面
Apr 24 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 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
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
取得父标签
2006/11/14 Javascript
javascript编程起步(第四课)
2007/02/27 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
室内设计专业学生的自我评价分享
2013/11/27 职场文书
30岁生日感言
2014/01/25 职场文书
员工合理化建议书
2014/05/19 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
旅游活动总结
2014/08/27 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
庆祝教师节标语
2014/10/09 职场文书
党员三严三实心得体会
2014/10/13 职场文书
LeetCode189轮转数组python示例
2022/08/05 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android