浅谈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 相关文章推荐
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
Java Spring 控制反转(IOC)容器详解
Oct 05 Java/Android
Springboot如何同时装配两个相同类型数据库
Nov 17 Java/Android
java executor包参数处理功能 
Feb 15 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
Java使用HttpClient实现文件下载
Aug 14 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 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
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP中“=>
2019/03/01 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
Python骚操作之动态定义函数
2019/03/26 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
安全生产管理合理化建议书
2014/03/12 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
幼师辞职信范文
2015/02/27 职场文书
报案材料怎么写
2015/05/25 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB