魔术方法介绍系列:概述
什么是魔术方法
Python 中我们可以自定义我们需要的类,并实现相关的类的方法。其中,有一种特殊的方法,它们的名称是以双下划线开始,并以双下划线结束,这些类的方法我们称为魔术方法(magic method)
。它们有另一个别名,叫做dunder 方法
,dunder
是 “Double Underscores" 的缩写。
魔术方法和普通方法的区别在于,魔术方法一般不会被显示地、主动地调用,而是当对象处在某个特定的场合,自动被调用。
在本人以前一些介绍 Python 的文章中,涉及到一些魔术方法,比如:
- 在 深入浅出地理解 Python 中可散列类型的原理和实现 系列文章中介绍的
__eq__
方法和__hash__
方法就是魔术方法,它们分别实现了对象的相等性比较和散列值计算。 - 在 Python 内置的序列类型 中介绍的几种序列类型,都可以通过 len() 方法来获取它们元素个数,len() 方法实际上会调用目标对象的
__len__
方法,它也是个魔术方法,来获取容器内元素个数。
C++ 中的运算符重载(operator overloading),用来重构某个运算符作用于对象的行为。Python的魔术方法,和 C++ 的运算符重载类似,但魔术方法使用范围更广,它不仅仅可以重载对象的诸如算数、赋值、关系型等运算符,还可以重载其它行为,比如上面提到的__hash__
方法,并不是重载一种运算符,而是重载如何计算对象的散列值;__len__
方法也不是重载运算符,而是重载如何计算对象的长度。
常用的魔术方法
魔术方法中最常用的方法,莫属于__init__
方法。它类似于 C++ 中的构造函数,用于定义如何创建类的对象。其实,Python 中用来构造类的对象,还有另一个方法__new__
。__new__
负责创建对象,__init__
负责初始化对象,这两个函数加在一起,才相当于 C++ 的构造函数的功能。另外,有构造就有析构,Python 中用来析构对象的方法是__del__
,它用来定义当对象被垃圾回收的时候,我们希望它做的事情。
第二类常用的魔术方法,是比较运算符。包括:__cmp__
、__eq__
、__ne__
、__lt__
、__gt__
、__le__
、__ge__
等方法,这些方法重构了对象间如何比较大小的逻辑,使得对象可以相互比较从而能用于一些排序方法中。
第三类较为常用的魔术方法,是算数运算符。包括:__add__
、__sub__
、__mul__
、__div__
、__mod__
、__pow__
等,这些方法重构了对象间如何用运算符计算的逻辑,实现后,对象可以直接用于一些算术表达式或数学函数进行计算。
第四类魔术方法,是一些类型转换方法。包括:__int__
、__long__
、__float__
、__hex__
等,这些方法通常被 Python 内置的类型转换方法调用。比如,当用 float() 函数想把一个对象转换成 float 类型时,会调用该对象的__float__
方法。
第五类魔术方法,是关于如何表达对象。包括:__str__
、__repr__
、__hash__
、__format__
等,这些方法定义了在一些特定场合如何展现对象的内容或者值。
第六类魔术方法,是关于获取或设置对象属性值的方法。包括:__getattr__
、__setattr__
、__delattr__
等。
除了以上类型,还有一些不太常用的魔术方法。具体可以参考 Python 的 data model 。
本人将在后续文章中,挑选部分常用的魔术方法展开介绍。
参考
https://docs.python.org/3/reference/datamodel.html
「 您的赞赏是激励我创作和分享的最大动力! 」
- 原文链接:https://zhuyinjun.me/2019/python_magic_method_summary/
- 版权声明:本创作采用 CC BY-NC 4.0 国际许可协议,非商业性使用可以转载,但请注明出处(作者、链接),商业性使用请联系作者获得授权。