Python中存在多种协议,用于实现鸭子类型(Duck Typing),下面分类介绍一下:
转换协议:
__str__
:在字符串格式化中如果有%s
占位符的话,Python会自动地调用相应对象的__str__()
方法格式化输出;__repr__
: 同样是格式化字符串,只是输出应面向机器(开发者);- 其他的还有
__long__
__float__
等,根据字面很好理解
比较大小的协议:
__eq__
__ne__
__lt__
__gt__
分别实现相等、不相等、小于、大于等判定,是实现操作符重载的基础;数值类型相关:
- 数值运算:
__add__
__mul__
__pow__
等,分别实现相加、相乘、幂运算等; - 位运算:
__lshift__
__rshift__
__and__
__xor__
分别实现左移位(<<)、右移位(>>)、逻辑与、异或等操作; - 运算赋值符:
__iadd__
__imul__
实现+=、*=等操作; - 其他还有
__pos__
__neg__
__abs__
实现正、负和绝对值等。
- 数值运算:
容器协议:
__len__
(查询容器中有多少对象)__getitem__
(通过类似a[i]形式获得i位置对象)__setitem__
(通过类似a[i]形式设置i位置对象)__delitem__
__reversed__
等;- 可调用对象协议: 通过它可以让类表现得像函数一样,例如
__init__
__new__
__call__
等 - 可哈希对象:只有支持可哈希协议类型才能作为字典的键,不过继承自object的新式类默认都支持;
- 属性协议:
__getattr__
__setattr__
__delattr__
获得、设置和删除类中指定的属性; - 上下文管理协议: 当我们打开文件等需要及时关闭的流对象时,可以使用with语句,它能够在使用完之后自动关闭对象;它的内部原理其实是实现了
__enter__
和__exit__
两个上下文管理对象,用户自定类只要实现了这两个方法就能使用with语句自动完成相关的清理工作。