浅谈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 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
springboot利用redis、Redisson处理并发问题的操作
Jun 18 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 Java/Android
简述Java中throw-throws异常抛出
Aug 07 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 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实现Session存储到Redis
2015/11/11 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
python安装oracle扩展及数据库连接方法
2017/02/21 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python中调试或排错的五种方法示例
2019/09/12 Python
Python全栈之列表数据类型详解
2019/10/01 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
Python networkx包的实现
2020/02/14 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
美国购车网站:TrueCar
2016/10/19 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
任课老师推荐信范文
2013/11/24 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
个人简历自荐信
2013/12/05 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
中学推普周活动总结
2015/05/07 职场文书
中学总务处工作总结
2015/08/12 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript