Python进阶:Python魔法方法

来源:互联网 发布:剑桥中国晚清史 知乎 编辑:程序博客网 时间:2024/05/17 02:34

小密圈内有好几个同学问我:学习完了Python基础之后,学些什么呢?


看到这个问题之后,我没在考虑学习基础之后学什么,而我在想真的学完了吗?想以前我也是对着w3c对着廖雪峰的网上教程学习了一遍Python,就开始写爬虫了,后来又读了《Python编程》《Python网络数据采集》等好几本书,感觉自己最少是把Python基础学完了。


不过当我看一些开源项目,看到很多的代码我都看不懂,我才慢慢明白,其实我只是处于Python入门阶段,我想大部分人与当时的我一样很迷茫。


从入门到进阶,一个很重要的点就是Python中的魔法方法,今天我就把自己压箱底货:之前学习Python魔法方法时候留下的笔记加工润色一遍送给大家,希望能对大家有用。


魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。它们经常是两个下划线包围来命名的(比如 __init__/__new__等等),Python的魔法方法是非常强大的。


如果你学习过Java,那你会发现Python中的魔法方法像是Java中的重载,Python中的魔法方法可以理解为:对类中的内置方法的重载,注意这里不是重写。


举个例子,Python中有个比较操作符==用来比较两个变量的大小,而这个操作符是通过内置函数__eq__来实现的,所以我们只需要通过改变这个内置函数代码,就可以改变重新定义这个操作符的行为。


我们定义一个类Word,继承自str类,现需要重新定义该类的操作符==,使这个操作符用来判断两个字符串长度是否相等,而不是通过字母顺序判断两个字符串是否相等。注意该变化只适用于Word类,而不适用于其它类。




再举个例子:Python中的__new__方法是对象实例化时调用的第一个方法,该方法仅读取一个cls参数后再把其他参数都传给用于指明对象初始化行为的__init__方法,也就是说我们可以在一个对象初始化之前进行其他操作,比如检查是否合法等;而另一个方法__del__可以用来销毁对象,定义了对象被垃圾回收的行为,我们可以利用该方法进行资源回收等操作。


我们可以通过重写__new__方法实现一个单例模式,在每次实例化之前检查该对象是否有已有实例。



通过这两个例子相信你已经对Python的魔法方法比较理解了,但是Python中的魔法方法远不止两三个,而在官方文档中,也没有一个比较详细的归纳,所以这里参考译文(点击阅读原文可以直达)做一个简单的汇总,希望大家可以根据这个汇总的表单对其中的魔法方法进行尝试,下次再看到这样的用法也就不足为奇了。


由于版本等问题,以下的表格对译文的内容进行了修改、删减。



以上是关于操作符运算符的方法,我们很少会改变这些魔法方法除非你真的需要改变他们,当然还有一些我们可能会用到的:


1、__str__/__repr__

__str__定义对类的实例调用str()时的行为。而__repr__定义对类的实例调用repr()的行为,这两者的区别就是repr面向机器,str面向人。定义类的输出的时候经常会使用这两个其中的魔法。



 2、__getattr__/__setattr__/__del__attr

使用这三个方法你可以随时修改、删除、添加类属性或值,是不是觉得大吃一惊?



Python中魔法函数常用的大体如上,也还有一些没有提到,你可以点击阅读原文进行学习。另外周五了,祝大家周末愉快。

原创粉丝点击