首页
学习
活动
专区
工具
TVP
发布

Python魔术方法-magic

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__会打印出当前文件所在的目录和文件名。

查看所有魔术方法和属性

下面的代码从内存中找出所有对象,并打印每个对象中的魔术方法:

常用魔术方法

如果有不清楚的,请在评论区留言。如果对你有帮助,记得收藏,然后点在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201115A0BCT600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券