Python神秘的魔法函数

Python进阶之路我觉得有两个东西一定要了解,一个是魔法函数一个是鸭子类型!Python之所以这么灵活,这么优美,跟这两大特性有很大的关系,今天我们来看看神秘的魔法函数。



01

什么是魔法函数

  • 听名字感觉很神秘,确实魔法函数之所以这么叫,确实是特别之处,一旦类里面加上这些特殊的函数,整个类就被附加了一些特定的功能.

  • Python里面的魔法函数,是以带双下划线开头和结尾,可以帮助类增强一些功能。这样方法可以在特定的情况下被Python调用,而几乎不用直接调用。

  • 魔法函数和本身的类没有关系,和类的父类,object也没有关系。魔法函数可以写到任意一个类中,跟继不继承没有必然的关系。

  • 魔法函数定义了,我们不需要显式的调用它,Python解释器自己会知道什么情况下会调用,我们只需要在使用相应的语法的时候就会调用。



02

快速上手魔法函数


Python里的魔法函数分2大类,一类是非数学运算相关的,一类是数学运算相关的,我们来看一下脑图:

1.非数学运算

我列出了一些常见的非数值运算的魔法函数,比如我们字符串类型的,集合序列类型的,迭代类型的,还有with属性相关的,加入这些函数就相当于注入了魔法,不信我们后面来看看实例。

Python神秘的魔法函数_第1张图片



1).比如有一个简单的类

一个Employee类,用来记录员工的信息

Python神秘的魔法函数_第2张图片

>>

Leo

Jack

Sam


2).利用魔法函数__getitem__

如果我们加上了魔法函数会怎么样,比如我们加上__getitem__看看,这个类会发现什么变化:

Python神秘的魔法函数_第3张图片

>>

Leo

Jack

Sam


  • Employee这个类加上了__getitem__魔法函数之后,这个类就变成了带有序列相关属性,也就是说这个类有了list功能。

  • 当我们for循环的时候,可以直接调用类里面的__getitem__函数,而且这一切都内置在Python解析器内自动完成,太酷了。

  • 厉害吧,什么都不用加,如果按照以前静态代码的思路,我们需要多继承,或者增加interface才行。

  • 而Python只要增加一个魔法函数就可以让这个类变成有其他的额外功能,神奇!


甚至你可以这样使用这个类:

print (ems[0])

>>Leo

print (ems[:2])

>>['Leo', 'Jack']


3).利用__str__魔法函数

我们看最开始的Employee类,这个类直接打印的话:

Python神秘的魔法函数_第4张图片

>><__main__.Employee object at 0x106f1d438>


如果我们加上了魔法函数__str__会变成怎么样?

Python神秘的魔法函数_第5张图片

>>This is Employee class

直接print 之后,会调用类里面的__str__方便我输入这个类的内容



2.数值相关的魔法函数

数值相关的魔法函数没有上面的那么常用,但在在一些特殊的场景里面会遇到。我们下看一下脑图:

Python神秘的魔法函数_第6张图片

1).比如绝对值

比如我们取一个数的绝对值:

print (abs(-100))


那么如果类里面也想有这样的功能,应该怎么办呢?

Python神秘的魔法函数_第7张图片

>>10


神奇吧,这样也行,直接对类取绝对值,就返回了10。相当于是abs(对象)的时候,直接调用类里面的__abs__函数


2).比如向量运算

还记得贪吃蛇的游戏吗(太酷了,Python66行代码,写一个贪吃蛇游戏),里面需要对坐标进行运算,这样的类,如果用上魔法函数,会大大简化我的代码:

Python神秘的魔法函数_第8张图片


我们要自定义一个向量类,我们希望这个类有运算功能,比如加,减这样的功能.

我们加上了__add__魔法函数之后,这个类就是想数值一样相加,相减。


v1=Vector(1,1)

v2=Vector(10,10)

print (v1+v2)

>>x:11,y:11



看这个类有了计算的功能,是不是很方便,类似的魔法函数还有很多,尤其是迭代器,序列类型和with类型是我们经常用的。


有同学可能会说,我平时写代码似乎也不需要用带魔法函数呀,是的,如果你只是写几百行上千行的代码确实不需要。但是如果你的代码变大,需要扩展,需要更灵活,或者你的代码要给别人当库,这个时候就需要仔细的考虑代码的架构了。


所以你一旦掌握了魔法函数,你就能写出让别人眼前一亮的代码,哇原来Python可以这样玩.


你可能感兴趣的:(python)