Python数据模型的核心是协议,即通过实现特定方法(如__len__、__getitem__等)使对象支持对应操作;常用协议包括__init__/__new__、__str__/__repr__、__eq__/__hash__、__contains__,且协议间存在隐含约束。
Python的数据模型是一套定义对象如何与语言交互的规则,其核心是“协议”——不是接口或抽象类,而是一组约定俗成的方法名和行为规范。只要对象实现了特定方法(如 __len__、__getitem__、__add__),它就自动支持对应操作(len()、下标访问、+运算)。这种设计让自定义类型能自然融入Python生态,无需继承特定基类。
掌握几个高频协议方法,就能显著提升类的可用性:
创建,__new__ 是真正的构造器,常用于单例、不可变类型定制eval(repr(obj)) == obj)in 操作符生效;若未实现,Python会退回到遍历 __iter__ 或尝试 __getitem__
行为定制不是靠条件判断,而是靠协议方法的有机组合。例如,要让一个序列类支持切片、迭代和成员检测:
obj[i],也自动支持 obj[start:stop] 和 for x in obj:(只要索引越界时抛 IndexError)len(obj) 可用,并使 __getitem__ 中的切片逻辑更健壮x in obj
协议不是孤立的,某些方法之间存在逻辑依赖。忽略这些容易引发意外行为:
立即学习“Python免费学习笔记(深入)”;
append),通常应同时实现 __iadd__(+=)而非仅依赖 __add__,否则 += 会创建新对象,违背原地修改预期if obj: 中优先调用它,若未定义则回退到 __len__(非零即真)