浅谈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
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 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中PDO基础教程 入门级
2011/09/04 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php实现的双色球算法示例
2017/06/20 PHP
Array.prototype 的泛型应用分析
2010/04/30 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
初识Javascript小结
2015/07/16 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
详解Python中的路径问题
2020/09/02 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
公司人力资源的自我评价
2014/01/02 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书