浅谈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 11 Java/Android
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
如何给HttpServletRequest增加消息头
Jun 30 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
Jul 15 Java/Android
Java反应式框架Reactor中的Mono和Flux
Jul 25 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
springboot新建项目pom.xml文件第一行报错的解决
Jan 18 Java/Android
JavaCV实现照片马赛克效果
Jan 22 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP 可阅读随机字符串代码
2010/05/26 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
yii2安装详细流程
2018/05/23 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
PHP7 标准库修改
2021/03/09 PHP
可输入的下拉框
2006/06/19 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
python str与repr的区别
2013/03/23 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
pandas参数设置的实用小技巧
2020/08/23 Python
Python实现微信表情包炸群功能
2021/01/28 Python
Python中生成ndarray实例讲解
2021/02/22 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
自我工作评价范文
2015/03/06 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
详解redis分布式锁的这些坑
2021/05/19 Redis
使用python绘制分组对比柱状图
2022/04/21 Python