Python Study (01) 之 特殊方法
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) 之 特殊方法的更多相关文章
- Python补充01 序列的方法
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...
- Python深入01 特殊方法与多范式
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradi ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- python子类调用父类的方法
python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...
- Python网络01 原始Python服务器
原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- Python语言上机题实现方法(持续更新...)
Python语言上机题实现方法(持续更新...) 1.[字符串循环左移]给定一个字符串S,要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a'.'b' ...
随机推荐
- Android与JS互相调用以及注意
近期项目中常常使用Html5而Android与JS调用常常会用到,这里记录一下,測试系统5.0以上. 这里先贴一下源代码 Activity: package jwzhangjie.com.webvie ...
- SVGImageView
In essence, I'm trying to layer multiple ImageViews (one of which is a floor plan, the other a recta ...
- [POJ 1639] Picnic Planning
[题目链接] http://poj.org/problem?id=1639 [算法] 首先,我们可以用深度优先遍历求出1号节点去除后有几个联通块 设共有T个联通块,若T > K则无解,否则 : ...
- Windows显示我的电脑到桌面以及给一些程序设置快捷键
Windows显示我的电脑到桌面,我测试的是windows server 2012和windows10 1.按Win(键盘上的微软徽标键)+R,输入: rundll32.exe shell32.dl ...
- Xposed那些事儿 — xposed框架的检测和反制
之前看到有人发了关于使用xposed屏蔽抖音检测xposed的思路(https://www.52pojie.cn/thread-684757-1-1.html),贴出了部分伪代码,但觉抖音写的蛮有意思 ...
- A - Antipalindrome
Problem description A string is a palindrome if it reads the same from the left to the right and fro ...
- Git Learning Part III - working remotely (Github)
help document of Github : https://help.github.com/ 1 upload 1.1 new update Initialize a repository ...
- 剖析Promise内部结构,一步一步实现一个完整的、能通过所有Test case的Promise类
本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,建议先了解Promise的使用 Promise标准解读 1.只有一个then方法,没有catch,ra ...
- 代码实现wordpress彩色标签云的最简单的方法
首先在wordpress主题文件夹内找到并用编辑器打开 functions.php 文件,随意找个位置不到插到别的函数里,“?>” 之前加入以下代码: //彩色标签云 function colo ...
- [C]关于交换
交换(c,c++): 1)temp交换(也适用于非数型) 定义一个新的变量,借助它完成交换. int a,b; a=10; b=15; int t; t=a; a=b; b=t; 2)位运算 位运算不 ...