Python深入:特殊方法和多范式

Python是一切皆对象,意思就是python的天生就是个“纯面向对象语言”呀。

但是!!!

Python还是一个多范式语言(multi-paradigm),即你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(当然还有函数式编程,java8也支持)。Python的多范式依赖于Python对象中的特殊方法(special method)。

特殊方法

特殊方法又被成为魔术方法(magic method,特殊方法就是方法名的前后各有两个下划线。

形如:__funcName__()

比如:当对象中定义了特殊方法的时候,Python也会对它们有“特殊优待”。比如定义了init()方法的类,会在创建对象的时候自动执行__init__( )方法中的语句完成对象创造。

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

- 比如int对象,就是dir(1)或者dir(int)

- 比如str对象,就是dir(“hello”)或者dir(str)

Python运算符的本质

:Python的运算符本质是通过调用对象的魔术方法实现的。

[Demo]:

‘hello’+’word’ #字符串的拼接,注意是new了一个新的return,之前的”hello”和”word”已经成了内存垃圾,等待GC清理

字符串拼接的本质实现呢?

‘hello’.__add__(‘word’) 也就是+号在str操作其实就是调用了这个特殊的方法!!

所以’hello’+’word’完全可以写成’hello’.__add__(‘word’)。

所以,在Python中,两个对象是否能进行加法运算,首先就要看相应的对象是否有定义__add__()方法。一旦相应的对象有定义__add__()方法,即使这个对象从数学概念上不可加,我们都可以用加法的形式,来表达obj.__add__()所定义的操作。在Python中,运算符起到简化书写的功能,但它依本质底层是靠特殊方法实现。 Python不强制用户使用面向对象的编程方法。用户可以选择自己喜欢的使用方式(比如选择使用+符号,还是使用更加面向对象的习惯使用__add__()方法)。

{More examples}

int.abs(-3) 等价 -(-3)

int.float(2) 等价 float(3)

a = 2

a.add(3) 等价 2+3

(1.8).mul(2.0) 等价 1.8*2.0

True.or(False) 等价 True or False

True.and(False) 等价 True and False

内置函数

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

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

实际上做的是

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

例如

(-1).__abs__()

(2.3).__int__()

java 也有,比如toString() equals()方法等,但是操作都是面向对象的方法涉及。

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)) #getitem就是获取下标元素的意思

{更多的操作:}

li.__setitem__(3, 100) 等价就是li[3]=100

li.__delitem__(2) 等价就是del li[2]

如果是dict

c={‘a’:1, ‘b’:2}

c.__delitem__(‘a’)

print(c)

函数

在Python中,函数也是一种对象。实际上,任何一个有__call__()特殊方法的对象都被当作是函数。__call__是使这个实例属性变成一个方法并调用

class Obj2func(object):  #我们把这个类的对象变成一个方法对象
def __call__(self, a): #函数对象处理的似乎就是调用这个方法。
return a + 5 #a+5的本质是a.__add__(5)哦 demo = Obj2func() # A function object
print(demo(2)) # Call function
res = list(demo, [2, 4, 5]) # Pass around function object
for i in res:
print(i,end=" ") #结尾变成空格隔开

**

1。demo是obj2fucn类的一个对象,当demo对象被操作似乎,首先触发调用__call__()

即demo执行加5的操作然后放回。

2。demo还可以作为函数对象,作为一个type(demo)等于

总结

对于内置的对象来说(比如整数、list、字符串等),它们本身所需要的特殊方法都已经在Python中人家早早的准备好了。Python的许多语法都是基于其面向对象模型的封装。对象模型是Python的骨架,是功能完备、火力强大的大黄蜂。但是Python也提供更加简洁的语法,让你使用不同的编程形态,从而在必要时隐藏一些面向对象的接口。

但是用户自己定义的对象是没有滴,你也可以通过增加特殊方法,来实现自定义的语法。简化你得对象的操作语法。当然直接封装为函数其实可读性更好吧

Python Study (01) 之 特殊方法的更多相关文章

  1. Python补充01 序列的方法

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...

  2. Python深入01 特殊方法与多范式

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradi ...

  3. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  4. python子类调用父类的方法

    python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...

  5. Python网络01 原始Python服务器

    原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...

  6. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  7. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  8. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  9. Python语言上机题实现方法(持续更新...)

    Python语言上机题实现方法(持续更新...) 1.[字符串循环左移]给定一个字符串S,要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a'.'b' ...

随机推荐

  1. PDF.NET支持最新的SQLite数据库

    最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...

  2. Shell case esac语句【转】

    本文转载自:http://c.biancheng.net/cpp/view/7006.html C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学: ...

  3. Linux Shell Scripting Cookbook 读书笔记 6

    wget,curl, tar, rsync wget ftp://example.com/somefile.img -t 5 -O download.img -o log -t表示重试的次数 -O指定 ...

  4. JDBC基础02

    今日知识 1. sql注入问题2. jdbc批处理3. 事务 SQL注入问题解决 1.什么是sql注入. * 用户通过相关的特殊关键字sql语句非法访问数据库 *例如: Xxx(' or '1'='1 ...

  5. centos6.5 + Nat网络模式 +SecureCRT 的相关设置

    步骤1:先去查看子网掩码和子网ip 提示:打开后先不要关闭,后边还会使用 步骤2:查看本机名 输入: hostname 步骤3:修改本机名 vi /etc/sysconfig/network 在”Ho ...

  6. Gitlab smtp 设置

    地址: https://blog.csdn.net/yongche_shi/article/details/78677163 # 腾讯云限制25发信端口,修改为465,并开启. https://doc ...

  7. asp、asp.net、ado、ado.net各自区别和联系?

    asp.net与ado.net 的区别? asp.net是微软公司的.Net技术框架下的B/S(网页方向)框架技术.ado.net则是由asp.net编程语言编写的数据访问层的总括..说白了就是:as ...

  8. Axis2 1.7.4构建项目

    1.下载axis2项目文件 http://axis.apache.org/axis2/java/core/download.html 2.Maven文件的pom.xml文件 3.将下载的axis2-1 ...

  9. 使用QT的一些小Tipster

    1.在使用Qt Creator编程时,难免会用到将float类型转换为QString类型的方法:原文 1.1. 将QString类型转化为float类型,很简单 QString data;       ...

  10. JS操作DOM的一些常用方法

    getElementById():获取有指定惟一ID属性值文档中的元素 getElementsByName(name):返回的是数组 getElementsByTagName():返回具有指定标签名的 ...