《流畅的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__