Python魔术方法
你一定用过魔术方法
你一定见过很多以下划线开头的方法,比如下面这些:
这些被称为魔术方法。之所以被称为魔术方法,是因为它们有特殊的含义,我们用一个例子来说明。
如果不想读文章,想看视频,请看另外一个专门的视频。
一个例子学懂魔术方法
我们可以给整数,或者字符串做加法:
我们来定义一个表示城市的类,它有两个属性名字(name)和人口数(pop):
在程序的最后一行,我们试图把两个城市相加,可惜程序报错了:
错误上说,City不支持加号。如何让它支持加号呢?很简单,只要我们给城市添加一个魔术方法__add__就搞定了:
我们给City增加了一个__add__方法,它的逻辑很简单,就是把名字相拼,人口相加,然后创建了一个新的城市。
这样程序的最后一行就不会报错了。
这说明这个__add__方法有一定魔力,当我们用加号+的时候,Python的解释器会自动去寻找__add__方法,如果这个对象没有这个方法,就报错了。
如果我们在City加上下面这几个方法,那么City就可以做加减乘除了:
整数之所以可以做加减乘除,也正是因为它有这几个方法。在交互式Python下运行dir(int)命令,仔细找一下是否有这几个方法:
再试一下dir(str),会发现str没有__sub__和__div__方法,所以它只能做加法和乘法,不能做减法,和除法。
魔术方法的定义
魔术方法对Python至关重要,可以说Python就是运行在魔术方法的轮子之上。
魔术方法是形如__xxx__的方法。
魔术方法都是内定的,具有特定的含义。
自己随便定义一个__xxx__方法是没用的。
每个Python的运算符的背后都有一个魔术方法,比如加法对应__add__
你熟悉的for循环就运行在魔术方法之上,被循环的对象(list等)之所以可以被循环,是因为它们有__iter__和__next__两个魔术方法。
你熟悉的len()函数,del操作符等都有背后的魔术方法。
知道为什么魔术方法是内定的了吧?因为它们和运算符是对应的,可以说是一个萝卜一个坑。
魔术方法的好处
魔术方法可以说是Python的一个优点,因为它可以非常灵活的实现运算符。
以上面的City的例子,我们通过实现魔术方法可以让City支持各种操作,包括可以被循环等。
我们使用最多的魔术方法一定是__init__方法,因为定义类就需要实现这个方法。
魔术属性
除了魔术方法,还有魔术属性,就是一些形如__yyy__的属性。这些属性通常是Python自动设置的属性,但我们可以使用这些属性。比如:
__name_是一个很重要的特殊属性,可以用它来判定当前模块是被直接调用的,还是被import进来的。可以去B站我的空间找这个视频仔细学习:
Python小技巧#1:name== 'main' 是做什么用的?
__file__会打印出当前文件所在的目录和文件名。
查看所有魔术方法和属性
下面的代码从内存中找出所有对象,并打印每个对象中的魔术方法:
常用魔术方法
如果有不清楚的,请在评论区留言。如果对你有帮助,记得收藏,然后点在看。
领取专属 10元无门槛券
私享最新 技术干货