浅谈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在个人电脑上实现微信扫码支付
Jun 13 Java/Android
Java框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
Java新手教程之ArrayList的基本使用
Jun 20 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Java线程的6种状态与生命周期
May 11 Java/Android
Android Studio 计算器开发
May 20 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
国内咖啡文化
2021/03/03 咖啡文化
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
Snoopy类使用小例子
2008/04/15 PHP
php编写一个简单的路由类
2011/04/13 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python正则表达式面试题解答
2020/04/28 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
研究生自我鉴定范文
2013/10/30 职场文书
企业业务员岗位职责
2014/03/14 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫