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 sys.path详细介绍
Oct 17 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
Python分支结构(switch)操作简介
Jan 17 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
Python中property函数用法实例分析
Jun 04 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
如何通过Django使用本地css/js文件
Jan 20 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 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
实用函数5
2007/11/08 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Python流程控制常用工具详解
2020/02/24 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
复古服装:RetroStage
2019/05/10 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
通用C#笔试题附答案
2016/11/26 面试题
教师产假请假条
2014/04/10 职场文书
化工见习报告范文
2014/10/31 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
vue 实现上传组件
2021/05/31 Vue.js