浅谈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 Swing实现自助取款机系统
Jun 11 Java/Android
详解Java实现设计模式之责任链模式
Jun 23 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
死磕 java同步系列之synchronized解析
Jun 28 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
JavaWeb Servlet开发注册页面实例
Apr 11 Java/Android
Java Spring Boot 正确读取配置文件中的属性的值
Apr 20 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
Jun 10 Java/Android
Java实现简单小画板
Jun 10 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
解析PHP提交后跳转
2013/06/23 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
前端必学之PHP语法基础
2016/01/01 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
python开发中range()函数用法实例分析
2015/11/12 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
PyTorch基本数据类型(一)
2019/05/22 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
商务主管岗位职责
2013/12/08 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
医院辞职信范文
2014/01/17 职场文书
自立自强的名人事例
2014/02/10 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
计生专干事迹
2014/05/28 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
导游词400字
2015/02/13 职场文书
部队2015年终工作总结
2015/04/02 职场文书