浅谈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 相关文章推荐
jackson json序列化实现首字母大写,第二个字母需小写
Jun 29 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
Java Socket实现多人聊天系统
Jul 15 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Java GUI编程菜单组件实例详解
Apr 07 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
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
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
Python返回真假值(True or False)小技巧
2015/04/10 Python
Python合并多个装饰器小技巧
2015/04/28 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
python能开发游戏吗
2020/06/11 Python
python/golang 删除链表中的元素
2020/09/14 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
出纳员的岗位职责
2014/02/22 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
西安兵马俑导游词
2015/02/02 职场文书
文员岗位职责
2015/02/04 职场文书
公司保密管理制度
2015/08/04 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
深入浅析Django MTV模式
2021/09/04 Python