python神秘的魔法函数_Python神秘的魔法函数

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

01

什么是魔法函数

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

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

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

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

02

快速上手魔法函数

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

1.非数学运算

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

8e02936b94726ca8295f52b6edb50a7c.png

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

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

22746d845050d4eea8488dbb969ba227.png

>>

Leo

Jack

Sam

2).利用魔法函数__getitem__

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

b22ea0e2bcfec607feb3044a2492ea23.png

>>

Leo

Jack

Sam

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

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

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

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

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

print (ems[0])

>>Leo

print (ems[:2])

>>['Leo', 'Jack']

3).利用__str__魔法函数

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

228b9e515293e53dcb3269d17e90c04a.png

>>

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

dccbb348ada4df6c30b5af2fdbe76c59.png

>>This is Employee class

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

2.数值相关的魔法函数

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

b3d687e45a34c4fa75b9fb68fa1466dd.png

1).比如绝对值

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

print (abs(-100))

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

37e380b7ab75d9ab0d4b5b10800c1317.png

>>10

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

2).比如向量运算

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

0622119620dbca1f2035e77f4ffbfb7c.png

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

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

v1=Vector(1,1)

v2=Vector(10,10)

print (v1+v2)

>>x:11,y:11

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值