Python常见魔术方法(特殊方法)使用指南
列举并解释Python中以下常用魔术方法的用途和实现约定:__call__、__enter__/__exit__、__str__/__repr__、__len__、__iter__/__next__、__contains__、__bool__、__hash__/__eq__。说明__str__和__repr__的区别,以及实现可哈希对象的条件。
回答
屠龙少年
__call__:使实例可被调用,obj()调用__call__,常用于函数式对象。
__enter__/__exit__:支持with语句。__exit__(self, exc_type, exc_val, exc_tb)返回True则压制异常。
__str__ vs __repr__:__str__面向用户(print()调用),__repr__面向开发者/调试(repr()或交互式解释器调用)。若无__str__,Python退而用__repr__。惯例:__repr__应返回能重建对象的字符串。
__len__:被len()调用,返回≥0整数。
__iter__/__next__:实现迭代器协议,__iter__返回self,__next__返回下一个值或raise StopIteration。
__contains__:被in调用。
__bool__:被bool()调用,若未实现则用__len__(非零为True)。
可哈希对象:同时实现__hash__和__eq__,且不可变(__hash__在生命周期内不变)。若只重写__eq__,__hash__被设为None。