流畅的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》 第一部分 序章 【数据模型】的更多相关文章

  1. [流畅的Python]第一章数据模型

    这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...

  2. 流畅的python第一章python数据模型学习记录

    python中有些特殊的方法,以双上下划线开头,并以双下划线结束的方法.如__getitem__,这些方法是特殊的方法,供python解释权内部使用,一般来说不需要调用 还有一种是以双下划线开头的,如 ...

  3. 《流畅的Python》Data Structures--第7章 colsure and decorator

    Function Decorators and Closures 装饰器是用于增强函数的行为,理解它,就必须先理解闭包. Python3引入关键字nonlocal,如果要理解闭包,就必须了解它的所有方 ...

  4. 《流畅的Python》Data Structures--第3章 dict 和 set

    dict and set 字典数据活跃在所有的python程序背后,即使你的源码里并没有直接使用它. 和dict有关的内置函数在模块builtins的__dict__内. >>> _ ...

  5. 『流畅的Python』第9章笔记_对象

    一.Python风格 以一个二元素向量对象为例 import math from array import array class Vector2d: typecode = 'd' def __ini ...

  6. 流畅的python 读书笔记 第二章 序列构成的数组 列表推导

    列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会. 2.2.1 列表推 ...

  7. 流畅的python第十九章元编程学习记录

    在 Python 中,数据的属性和处理数据的方法统称属性(attribute).其实,方法只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法 ...

  8. 流畅的python第十六章协程学习记录

    从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中,yield 通常出现在表达式的右边(例如,datum = yield),可以产出值,也可以不产出——如果 yi ...

  9. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

    在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...

随机推荐

  1. 基于canal的client-adapter数据同步必读指南

    本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性.高可用与监控报警.(基于canal 1.1.4版本) canal作为mysql的实时数据订阅组件,实现了对 ...

  2. 关于“枚举{0,1,...,n-1}所包含的所有大小为k的子集”的理解

    前言 今天整理以前的竞赛笔记时,发现了当时写的一个模板: 枚举{0,1,-,n-1}所包含的所有大小为k的子集: int comb = (1 << k) - 1; while (comb ...

  3. linux中root用户查看所有用户的历史操作命令

    转载https://blog.csdn.net/qq_27786919/article/details/91353351 1.创建用户审计文件存放目录和审计日志文件 :mkdir -p /var/lo ...

  4. 实用js方法DataUrl转为File、url转base64

    声明:仅为方便自己所需,也希望能方便他人,如有侵权,联系删除. 1,DataUrl转为File /** * DataUrl转为File * @param {String} dataUrl - data ...

  5. Linux打包压缩解压工具

    第1章      Linux 打包压缩解压工具一.压缩.解压工具 compress/uncompress gzip/gunzip bzip2/bunzip2/ bzcat xz/unxz/ xzcat ...

  6. python链表从尾到头的顺序返回一个ArrayList

    思路:获取链表的值,添加入列表中,反转列表即可获得ArrayList # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): ...

  7. SpringMVC-12-SSM回顾与总结

    12.SSM回顾与总结

  8. IOC 原理

    SpringIOC实现原理 1. 依赖倒置 假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车.这里就出现了一个“依赖”关系:汽车依赖车身,车 ...

  9. 写一个简单的 Linux Shell (C++)

    这里可以找到代码 github.com/z0gSh1u/expshell 支持的特性 单条指令的执行 引号引起的参数(如 $ some_program "hello, world" ...

  10. 一文搞懂Cookie,Session,Token,JWT

    HTTP协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息.这样一些交互业务就无法支撑了.Cookie应运而生. Cookie 通过F12开发者工具,先瞅瞅Cookie的颜值 从图中 ...