浅谈Python魔法方法
作者:程序员赤小豆 发布时间:2022-03-13 01:04:19
特殊方法一览
在 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
是不是还挺有意思的, 自己动手玩一玩吧~
来源:https://blog.csdn.net/weixin_43851569/article/details/117820775


猜你喜欢
- 目录Python1 Python垃圾回收机制是什么2 元组和列表的区别3 元组可以作为字典的key?4 进程 线程 协程4.1 进程4.2
- 这个分页使用的是0游标,也就是Rs.Open Sql,Conn,0,1。但是感觉也快不了多少,10万条数据的分页时间300多豪秒之间。风格A
- 不知道用ASP写代码的朋友是不是和我有一样的感受,ASP中最头疼的就是调试程序的时候不方便,我想可能很多朋友都会用这样的方法&ldq
- 问题:python3 如何转换html到pdf描述:我的电脑是windows764位,python3.4我想用python 转换html到p
- 一、触发器概念触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是由事件来触
- 本文实例讲述了Python反射用法。分享给大家供大家参考,具体如下:class Person: def __init__(sel
- 获取评论贴的请求头与表单数据下一篇在这里这里,我们随便选取一个网站,获取该贴评论后的请求头,表单数据以及评论贴链接。(因为涉及敏感信息,自己
- 1 什么是K8ssandraCassandra是一款非常优秀的开源的分布式NoSQL数据库,被许多优秀的大公司采用,具有高可用、弹性扩展、性
- 很多朋友问过我absolute与relative怎么区分,怎么用?我们都知道absolute是绝对定位,relative是相对定位,但是这个
- 写models.py时缺少了一个 verbose_name,导致数据库出现问题,整了很久,摸索出重新建立数据库的方法:首先删除每个app中的
- 单例模式的实现方式将类实例绑定到类变量上class Singleton(object): _instance = Nonedef
- 本文介绍了数据库索引,及其优、缺点。针对MySQL索引的特点、应用进行了详细的描述。分析了如何避免MySQL无法使用,如何使用EXPLAIN
- 参照资料:selenium webdriver添加cookie: https://www.jb51.net/article/193102.h
- 序言哈喽兄弟们,今天咱们来了解一下 fileinput 。说到fileinput,可能90%的码农表示没用过,甚至没有听说过。这不奇怪,因为
- 一、进程与线程进程是操作系统资源分配的基本单位,是程序运行的实例。例如打开一个浏览器就开启了一个进程。线程是操作系统调度到CPU中执行的基本
- 解决方案1: 调用windows 的shell,但会有安全问题. * browseFolder.js * 该文件定义了BrowseFolde
- 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进
- SMTP模块这么多已定义的类中,我们最常用的的还是smtplib.SMTP类,就具体看看该类的用法:smtp实例封装一个smtp连接,它支持
- 本文实例讲述了Python实现的网页截图功能。分享给大家供大家参考,具体如下:方法一、使用PyQt4的QtWebKit组件#!/usr/bi
- 在web2.0的站中用户互动性是很强的,例如用户留言我们可能放开img标签,允许用户外链其他站点的图片,那么我们就需要解决图片尺寸过大所带来