浅谈Python魔法方法

作者:程序员赤小豆 时间:2022-03-13 01:04:19 

特殊方法一览

浅谈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

是不是还挺有意思的, 自己动手玩一玩吧~

来源:https://blog.csdn.net/weixin_43851569/article/details/117820775

标签:Python,魔法方法
0
投稿

猜你喜欢

  • 301转向代码合集

    2008-03-20 10:12:00
  • python 邮件检测工具mmpi的使用

    2022-03-18 04:56:45
  • 基于PyQt5制作一个群发邮件工具

    2022-09-04 01:46:46
  • mpvue+vant app搭建微信小程序的方法步骤

    2024-05-29 22:22:42
  • 解决pytorch 交叉熵损失输出为负数的问题

    2022-04-29 10:17:33
  • python进阶之自定义可迭代的类

    2022-09-20 10:18:48
  • 如何更优雅地写python代码

    2022-03-03 04:53:24
  • pytest解读fixtures之Teardown处理yield和addfinalizer方案

    2023-06-18 22:13:01
  • 关于Python可视化Dash工具之plotly基本图形示例详解

    2023-08-13 15:51:57
  • Python和Go成为2019年最受欢迎的黑客工具(推荐)

    2021-05-22 16:37:17
  • 关于vs2019安装不了扩展问题的解决方法

    2023-10-08 06:57:29
  • Python读取mat文件,并保存为pickle格式的方法

    2023-02-15 19:34:41
  • 用Python生成N层的杨辉三角的实现方法

    2022-12-20 16:27:09
  • python工具之清理 Markdown 中没有引用的图片

    2022-02-14 11:44:39
  • 教学演示-UBB,剪贴板,textRange及其他

    2008-01-27 13:46:00
  • python图片灰度化处理的几种方法

    2023-03-05 01:14:57
  • 利用Python正则表达式过滤敏感词的方法

    2023-05-07 05:05:18
  • win2003 mysql单向同步配置步骤[已测]

    2024-01-14 18:22:16
  • JavaScript 图片变换效果(ie only)

    2010-01-20 12:40:00
  • Mysql的语句生成后门木马的方法

    2024-01-15 20:46:23
  • asp之家 网络编程 m.aspxhome.com