流畅的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. Codeforces 1324F Maximum White Subtree DFS

    题意 给你无根一颗树,每个节点是黑色或白色.对于每一个节点,问包含该节点的权值最大的子树. 子树的权值等于子树中白点的个数减去黑点的个数. 注意,这里的子树指的是树的联通子图. 解题思路 这场就这题卡 ...

  2. 一文搞懂WordPress建站

    文章首发于:https://zouwang.vip/ 日日夜夜的等待,WordPress建站教程终于来了.本篇文章适用于第一次建站的小白,帮助你从零搭建起一个属于自己的网站,既然是从零,那么我就会带着 ...

  3. 通过股票K线图来谈谈真正的技术和现实的技术

    开局一张图 这是一张股票日线图,上面记载这近期每个交易日该股的开盘价,收盘价,最高价,最低价. 有兴趣的人可以估算下数据量和表的设计,似乎有点工作量.可这还只是一部分,你还可以获得每日分时数据,成交量 ...

  4. AMQP 概论

    AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制.目标是实现一种在全行业广泛使用的标准消 ...

  5. Brup sute

    暴力破解

  6. JS的全局变量无法给Ajax里的变量赋值

    前阶段遇到这么一个问题,在JS定义一个全局变量,JS方法里的其他地方都能使用,偏偏ajax里无法赋值,也不是无法赋值,但赋值总是慢一拍,具体的解决方案如下图所示:

  7. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  8. Ruby探微初步

    我的导师,曾经对我说过,常规编程语言大抵不过顺序.条件.循环 接下来以Ruby为例,简单说说 控制语句 控制语句能让程序在某种条件下,改变执行顺序,或者只执行某一部分. 控制语句的分类 控制语句大致可 ...

  9. Anaconda使用及管理

    接下来均是以命令行模式进行介绍,Windows用户请打开"Anaconda Prompt":macOS和Linux用户请打开"Terminal"("终 ...

  10. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)请自取

    最近在读,附上网盘链接 复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1U6yFeZxz9uD6sSiu-Br06g 提取码:3Wt4