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__()特殊方法的对象都被当作是函数。比如下面的例子:

classSampleMore(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功能的实现都要依赖于特殊方法。我们将在以后看到更多的例子。

大黄蜂,还是Camaro跑车

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

如果你喜欢这篇文章,欢迎推荐。

技术推动进步,分享促进社区。

python深入与提高_Python深入01 特殊方法与多范式相关推荐

  1. python格式化字符串漏洞_Python字符串格式化的方法(两种)

    本文介绍了Python字符串格式化,主要有两种方法,分享给大家,具体如下 用于字符串的拼接,性能更优. 字符串格式化有两种方式:百分号方式.format方式. 百分号方式比较老,而format方式是比 ...

  2. python中len字典_Python 字典(Dictionary) len()方法

    Python 字典(Dictionary) len()方法 描述 Python 字典(Dictionary) len() 函数计算字典元素个数,即键的总数.高佣联盟 www.cgewang.com 语 ...

  3. 高淇python讲义百度文库_python 面向对象01

    原创是:高淇老师讲义 Python 中 一切皆对象 ========================================================================== ...

  4. python你好怎么写_Python基础01之“你好世界”

    简单的'你好世界' 首先要安装好Python Python命令行 假设你已经安装好了Python, 那么在Linux命令行输入: $python 将直接进入python.然后在命令行提示符>&g ...

  5. 廖雪峰python教程整理笔记_python小白01廖雪峰python教程笔记

    高级特性 切片:前10个数,每两个取一个: L[:10:2]:[0, 2, 4, 6, 8] 可迭代对象的判断: isinstance('abc', Iterable) list变成索引-元素对:fo ...

  6. python语言格式化输出_Python format()格式化输出方法详解

    原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...

  7. python prettytable格式设置_Python prettytable的使用方法

    原博文 2015-10-22 19:09 − ###Python prettytable的使用方法 prettytable可以整齐地输出一个表格信息: +-----------+------+---- ...

  8. python datetime计算时间差_python计算时间差的方法

    本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: 1.问题: 给定你两个日期,如何计算这两个日期之间间隔几天,几个星期,几个月,几年? 2.解决方法: 标准模块date ...

  9. python算法1加1_【Python爬虫作业】- 第一周01 笨方法0-10加分题

    1. print("hello world!") print("hello again") print("i like typing this&quo ...

最新文章

  1. Silence - 专注于阅读的博客园主题
  2. Java for LeetCode 206 Reverse Linked List
  3. 使用Schematics启用SAP Spartacus的SSR模式
  4. CSS选择器与Xpath常用语法及对比
  5. C语言基础教程之头文件
  6. atitit.  web组件化原理与设计
  7. 2021-09-07218. 天际线问题
  8. 数学建模——五步方法
  9. 网课题库收录API接口以及免费网课查询API接口
  10. 联想小新 Pro 14、联想小新 Pro 16 2023 酷睿版 评测 怎么样值得买吗
  11. 【Linux入门学习之】Ubuntu常用软件
  12. swift 在linux系统,Linux下搭建Swift语言开发学习环境
  13. 学习软件工程的知名网站
  14. u盘损坏 Can't Read Superblock
  15. 用友OA漏洞学习——NCFindWeb 目录遍历漏洞
  16. Windows脚本 - Bat批处理命令使用教程
  17. 居然在循环时犯了大错,难怪差这么多
  18. 配置多个tomcat和使用负载均衡
  19. 如何打造一直具有战斗力的高效团队?
  20. HDU 6203ping ping ping(LCA+贪心)

热门文章

  1. [Google Guava] 排序: Guava强大的”流畅风格比较器”
  2. HTML 标签 参考手册
  3. 《卓有成效的程序员》----读书笔记一
  4. 利用jquery给指定的table动态添加一行、删除一行
  5. 程序员面试题精选100题(37)-寻找丑数[算法]
  6. 感知器 Perceptron
  7. 人工智能:第九章 Agent (艾真体)
  8. VS2010+OpenCV2.4.3配置(一次设置,永久生效)
  9. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.3. 有心朝Linux作业系统学习者的学习态度)
  10. Emacs常用快捷键