你在写 Python 代码的时候,应该时常会看到一些比较特殊的函数,它们是用两根杠杠作为开头和结尾的,比如你最常见到的初始化方法:
当你去实例化这个对象的时候,这个 init 方法就特么直接被执行了。
这是为啥呢?就是因为它有「魔法」。
你可以使用 dir() 将你的对象传进去调用一波,你会发现这么一个现象:
看到没,我们在写类的时候,并没有去写这些方法啊,为什么会有这些玩意啊?
其实这些是 Python 已经内置好了的方法,而且都是用「两根杠杠」作为开头和结尾的,这样能彰显出它们的特殊,也就是说,它们都具有「魔法」。
那么它们的特殊之处在哪?
其实你一开始就已经看到了,这些魔法方法我们压根不需要自己去调用,Python 会自动去调用它们。
比如我们刚刚写的 init 方法,我们只是实例化一下对象,它就自动执行了这个方法,我们并没有 dog.__init__(),对吗?
其实,实例化对象最先执行的不是 init 魔法方法,还有一个在它前面执行,那就是 new 这个魔法方法,比如这个:
当你实例化时:dog = Dog(‘热狗’),这时候执行结果是这样的:
>>>执行了 cls 方法
>>>cls–<class’__main__.Dog’>, arg–热狗
>>>执行了 init 方法
也就是说, new 这个魔法方法在类被实例化时会被优先自动调用,其中第一个参数可以拿到当前类,第二个可以拿到构造对象传来的参数。
一般在 new 方法中可以生成新的实例,它会将参数传给实例的 init 方法。。。
是不是有点懵逼?
没关系,我只是举个例子跟你说魔法方法是什么,new 这个魔法方法基本上很少使用。
关于 Python 的魔法方法,你可以在这里找到:
https://docs.python.org/3/reference/datamodel.html#special-method-names
所以我们每次在定义类的时候,都会对已经内置好了的魔法方法进行「重载」,让魔法方法按我们需要的方式去执行相应的东西,就像你开头看到的那样,我们最常重载的魔法方法就是 init 。
比如你想要让两个狗对象使用 + 操作就可以返回它们的年龄之和,那么你就可以重载这个 + 的操作,因为 + 对应的魔法方法是 add, 所以你可以这样重载:
同样的,你想要让对象做一些特殊的格式输出,那么你就可以重载 str 魔法方法:
OK, 今天想给你分享的是知道什么是魔法方法以及如何去使用,以上几个是比较常用的魔法方法,还有更多的魔法方法详情你可以看看文中我给你发的文档链接:
希望对你有所帮助,那么我们下回见,peace!
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试