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 Mysql自动备份脚本
Jul 14 Python
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
给Python入门者的一些编程建议
Jun 15 Python
分析用Python脚本关闭文件操作的机制
Jun 28 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
python画蝴蝶曲线图的实例
Nov 21 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 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
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
javascript新手语法小结
2008/06/15 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
python33 urllib2使用方法细节讲解
2013/12/03 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
Python整数对象实现原理详解
2019/07/01 Python
python3 求约数的实例
2019/12/05 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
告诉你怎样写创业计划书
2014/01/27 职场文书
社团文化节策划书
2014/02/01 职场文书
收费员岗位职责
2015/02/14 职场文书
农村党员干部承诺书
2015/05/04 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript