Python深入学习之特殊方法与多范式


Posted in Python onAugust 31, 2014

Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式、声明式等,我们暂不深入)。Python的多范式依赖于Python对象中的特殊方法(special method)。

特殊方法名的前后各有两个下划线。特殊方法又被成为魔法方法(magic method),定义了许多Python语法和表达方式,正如我们在下面的例子中将要看到的。当对象中定义了特殊方法的时候,Python也会对它们有“特殊优待”。比如定义了__init__()方法的类,会在创建对象的时候自动执行__init__()方法中的操作。

(可以通过dir()来查看对象所拥有的特殊方法,比如dir(1))

运算符

Python的运算符是通过调用对象的特殊方法实现的。比如:

'abc' + 'xyz'               # 连接字符串

实际执行了如下操作:
'abc'.__add__('xyz')

所以,在Python中,两个对象是否能进行加法运算,首先就要看相应的对象是否有__add__()方法。一旦相应的对象有__add__()方法,即使这个对象从数学上不可加,我们都可以用加法的形式,来表达obj.__add__()所定义的操作。在Python中,运算符起到简化书写的功能,但它依靠特殊方法实现。

Python不强制用户使用面向对象的编程方法。用户可以选择自己喜欢的使用方式(比如选择使用+符号,还是使用更加面向对象的__add__()方法)。特殊方法写起来总是要更费事一点。

尝试下面的操作,看看效果,再想想它的对应运算符

(1.8).__mul__(2.0)
True.__or__(False)

内置函数

与运算符类似,许多内置函数也都是调用对象的特殊方法。比如

len([1,2,3])      # 返回表中元素的总数

实际上做的是
[1,2,3].__len__()

相对与__len__(),内置函数len()也起到了简化书写的作用。

尝试下面的操作,想一下它的对应内置函数

(-1).__abs__()
(2.3).__int__()

表(list)元素引用

下面是我们常见的表元素引用方式

li = [1, 2, 3, 4, 5, 6]

print(li[3])

上面的程序运行到li[3]的时候,Python发现并理解[]符号,然后调用__getitem__()方法。
li = [1, 2, 3, 4, 5, 6]

print(li.__getitem__(3))

尝试看下面的操作,想想它的对应
li.__setitem__(3, 0)
{'a':1, 'b':2}.__delitem__('a')

函数

我们已经说过,在Python中,函数也是一种对象。实际上,任何一个有__call__()特殊方法的对象都被当作是函数。比如下面的例子:

class SampleMore(object):

    def __call__(self, a):

        return a + 5
add = SampleMore()     # A function object

print(add(2))          # Call function    

map(add, [2, 4, 5])    # Pass around function object

add为SampleMore类的一个对象,当被调用时,add执行加5的操作。add还可以作为函数对象,被传递给map()函数。

当然,我们还可以使用更“优美”的方式,想想是什么。

总结

对于内置的对象来说(比如整数、表、字符串等),它们所需要的特殊方法都已经在Python中准备好了。而用户自己定义的对象也可以通过增加特殊方法,来实现自定义的语法。特殊方法比较靠近Python的底层,许多Python功能的实现都要依赖于特殊方法。我们将在以后看到更多的例子。

Python的许多语法都是基于其面向对象模型的封装。对象模型是Python的骨架,是功能完备、火力强大的大黄蜂。但是Python也提供更加简洁的语法,让你使用不同的编程形态,从而在必要时隐藏一些面向对象的接口。正如我们看到的Camaro跑车,将自己威风的火药库收起来,提供方便人类使用的车门和座椅。

Python 相关文章推荐
python基础教程之分支、循环简单用法
Jun 16 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python Flask基础教程示例代码
Feb 07 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python实现飞机大战
Sep 11 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
Python基本数据类型之字符串str
Jul 21 Python
python中的reduce内建函数使用方法指南
Aug 31 #Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 #Python
python进阶教程之动态类型详解
Aug 30 #Python
python进阶教程之异常处理
Aug 30 #Python
python进阶教程之函数对象(函数也是对象)
Aug 30 #Python
python进阶教程之循环对象
Aug 30 #Python
python进阶教程之循环相关函数range、enumerate、zip
Aug 30 #Python
You might like
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP比你想象的好得多
2014/11/27 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
javascript parseInt 大改造
2009/09/27 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
python urllib爬虫模块使用解析
2019/09/05 Python
pygame实现弹球游戏
2020/04/14 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
写好自荐信的技巧
2013/11/08 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
师德师风个人总结
2015/02/06 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
美丽人生观后感
2015/06/03 职场文书
对公司的意见和建议
2015/06/04 职场文书
收入证明范本
2015/06/12 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS