《流畅的Python》 第一部分 序章 【数据模型】
流畅的Python
致Marta,用我全心全意的爱
第一部分 序幕
第一章 Python数据模型
特殊方法
定义:
Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语句len(x) 调用了x.__ len __的方法。这些特殊方法支持以下的语言构架:
- 迭代
- 集合类
- 属性访问
- 运算符重载
- 函数和方法的调用
- 对象的创建和销毁
- 字符串表示形式和格式化
- 管理上下文(with块)
命名规则:
__ getitem __ (左右两个双下划线,故称为dunder method)
使用方法:
通过内置函数调用
| 内置函数 | 对应的对象方法 |
|---|---|
| len(x) | x.__ len __ |
| repr(x) | x.__ repr __ |
| str(x) | x.__ str __ (如果没有该方法,则调用 x.__ repr __ ) |
| bool(x) | x.__ bool __ (如果没有该方法,则调用 x.__ len __ ) |
| x[i] | x.__ getitem __ |
| in x | x.__ contains __ |
| ... | ...... |
repr 与 str 方法
__ repr __ : 把对象用字符串的形式表达出来,当控制台打印实例时,调用repr方法输出,如果没有实现repr,则打印出来的字符串可能是< 类 对象 at 0x10e100070 >
__ str __ : 调用str()函数被使用,或是在用print函数打印一个对象被调用,并且它返回的字符串对终端用户更友好。
如果只想实现一个方法,则选择__ repr __ ,因为当 __ str __ 没有实现时,__ repr __ 会作为替代。
特殊地
内置对象的特殊函数会直接返回相应的属性值(更快),比如列表、字符串、字节序列、CPython对于__ len __会直接返回PyVarObject里的ob_size属性。
通过内置函数不仅可以调用内置对象,还可以调用自定义对象的方法,这种处理方式在保持内置类型的效率和保证语言的一致性之间找到了一个平衡点,达成了一定的统一。不能让特例特殊到破坏既定的规则。
特殊方法一览
#--------------跟字符串无关的特殊方法---------------------
字符串 ``/``字节序列表示形式
__repr__、 __str__、 __format__、 __bytes__
数值转换
__abs__、 __bool__、 __complex__、 __int__、 __float__、 __hash__、 __index__
集合模拟
__len__、 __getitem__、 __setitem__、 __delitem__、 __contains__
迭代枚举
__iter__、 __reversed__、 __next__
可调用模拟
__call__
上下文管理
__enter__、 __exit__
实例创建和销毁
__new__、 __init__、 __del__
属性管理
__getattr__、 __getattribute__、 __setattr__、 __delattr__、 __dir__
属性描述符
__get__、 __set__、 __delete__
跟类相关的服务
__prepare__、 __instancecheck__、 __subclasscheck__
#--------------跟字符串相关的特殊方法---------------------
一 元 运 算 符
__neg__ -、 __pos__ +、 __abs__ abs()
众多比较 运 算 符
__lt__ <、 __le__ <=、 __eq__ ==、 __ne__ !=、 __gt__ >、 __ge__ >=
算 术 运 算 符
__add__ +、 __sub__ -、 __mul__ *、 __truediv__ /、 __floordiv__ //、 __mod__ %、
__divmod__ divmod()、 __pow__ ** 或pow()、 __round__ round()"
反 向 算 术 运 算 符
__radd__、 __rsub__、 __rmul__、 __rtruediv__、 __rfloordiv__、 __rmod__、 __rdivmod__、__rpow__
增 量 赋 值 算 术 运 算 符
__iadd__、 __isub__、 __imul__、 __itruediv__、 __ifloordiv__、 __imod__、 __ipow__
位 运 算 符
__invert__ ~、 __lshift__ <<、 __rshift__ >>、 __and__ &、 __or__ |、 __xor__ ^
反 向 位 运 算 符
__rlshift__、 __rrshift__、 __rand__、 __rxor__、 __ror__
增 量 赋 值 位 运 算 符
__ilshift__、 __irshift__、 __iand__、 __ixor__、 __ior__
《流畅的Python》 第一部分 序章 【数据模型】的更多相关文章
- [流畅的Python]第一章数据模型
这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...
- 流畅的python第一章python数据模型学习记录
python中有些特殊的方法,以双上下划线开头,并以双下划线结束的方法.如__getitem__,这些方法是特殊的方法,供python解释权内部使用,一般来说不需要调用 还有一种是以双下划线开头的,如 ...
- 《流畅的Python》Data Structures--第7章 colsure and decorator
Function Decorators and Closures 装饰器是用于增强函数的行为,理解它,就必须先理解闭包. Python3引入关键字nonlocal,如果要理解闭包,就必须了解它的所有方 ...
- 《流畅的Python》Data Structures--第3章 dict 和 set
dict and set 字典数据活跃在所有的python程序背后,即使你的源码里并没有直接使用它. 和dict有关的内置函数在模块builtins的__dict__内. >>> _ ...
- 『流畅的Python』第9章笔记_对象
一.Python风格 以一个二元素向量对象为例 import math from array import array class Vector2d: typecode = 'd' def __ini ...
- 流畅的python 读书笔记 第二章 序列构成的数组 列表推导
列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会. 2.2.1 列表推 ...
- 流畅的python第十九章元编程学习记录
在 Python 中,数据的属性和处理数据的方法统称属性(attribute).其实,方法只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法 ...
- 流畅的python第十六章协程学习记录
从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中,yield 通常出现在表达式的右边(例如,datum = yield),可以产出值,也可以不产出——如果 yi ...
- 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录
在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...
随机推荐
- Python自动化测试入门科技树
Python基础: 入门语法和数据类型: 编码环境安装基本语法 常用数据类型 常用运算符 Llist.Tuple.Dict.if&for.while Python进阶: 函数: 语法 内置函数 ...
- [BUUOJ记录] [BJDCTF 2nd]old-hack & Schrödinger & elementmaster
三道比较简单的的题放一起一写,old-hack是ThinkPHP框架的一个nday,Schrödinger和elementmaster没啥考点,就是脑洞 一.old-hack 进入题目没发现什么Hi ...
- 6 年前,只会 JSP 和 Servlet 就可以找到工作
这篇文章在去年就已经构思了,不过一直都没有整理出来,今天终于完成了这篇文章,所以发上来给大家看一看,都是一些个人的小感慨,我的观点可能不是非常的完善,大家也可以一起讨论. 找工作之难,难于上青天 五六 ...
- 【问题】Java和Scala混合编译下无法正常使用lombok的问题
工作中有java和scala和混合编译的工程,最近遇到一个问题,就是工程中有依赖java bean的scala文件,编译过程中发现编译器无法找到Java bean 中 lombok生成的getter, ...
- 03 父子组件sync&update
父组件传给子组件是基本数据类型. 父组件 <template> <el-container class="consele-container"> <e ...
- Activiti7 流程变量(理论)
什么是流程变量 流程变量在Activiti中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和Activiti结合时少不了流程变量,流程变量就是Activiti在管理工作流时根据管理需要而设 ...
- 【BIM】基于BIMFACE的空间拆分与合并
BIMFACE中矩形空间拆分与合并 应用场景 在BIM运维场景中,空间同设备一样,作为一种资产被纳入运维管理体系,典型的应用场景例如商铺.防火分区等,这就涉及到空间的拆分和合并,在bimface中,已 ...
- C#知识点:抽象类和接口浅谈
首先介绍什么是抽象类? 抽象类用关键字abstract修饰的类就是叫抽象类,抽象类天生的作用就是被继承的,所以不能实例化,只能被继承.而且 abstract 关键字不能和sealed一起使用,因为se ...
- Oracle Sqlplus 三项设置
显示sql执行时间:set timing on 显示sql execute plan:set autotrace trace exp 关闭 set autotrace off 设置行宽:set li ...
- MySQL教程 | 菜鸟教程
装数据库失败后的重装步骤!!! --[创建数据库]CREATE DATABASE <数据库名>: --使用mysqladamin 创建数据库-- 使用普通用户,你可能需要特定的权限来创建或 ...