特殊方法与 Python 数据模型
面向对象与高级 Python#Python全栈#第三阶段#面向对象与高级 Python#特殊方法与 Python 数据模型约 596 字 · 2 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
__str__() 与 __repr__() 有什么区别?
追问 面向用户展示与开发排错如何选择?为什么对象表示中不应包含密码或 Token?
如何让自定义对象支持 len() 与真假判断?
追问
__len__() 与 __bool__() 如何参与判断,各自的返回值有什么约束?__eq__() 应如何定义业务相等性?
追问 两个用户是按身份编号还是全部字段比较?遇到不支持的类型如何处理?
相等性与 __hash__() 为什么需要保持一致?
追问 对象作为字典 Key 后,参与哈希计算的字段变化可能产生什么问题?
__getitem__() 如何让对象支持下标访问?
追问 整数索引、切片、不合法 Key 和越界应该怎样定义行为?
__contains__() 可以定义什么成员判断?
追问
item in collection 判断 ID 还是对象,需要如何在接口中说明?__call__() 如何让实例像函数一样使用?
追问 带配置的校验器或策略对象什么时候适合这种接口?
__new__() 与 __init__() 在生命周期中有什么区别?
追问 什么时候才有必要自定义对象创建行为?为什么普通业务类通常不用改写
__new__()?为什么不应依赖 __del__() 及时释放关键资源?
追问 对象生命周期、引用关系与解释器退出如何影响清理?还有什么更明确的管理方式?
__slots__ 解决什么问题,又有哪些限制?
追问 动态属性、继承与内存占用如何验证?为什么它不是权限保护或通用性能开关?
特殊方法的调用约定可参考 Python 官方数据模型文档,不要只根据方法名字推测行为。