为什么Python文件write方法写入类实例时不会自动调用__str__?
两种操作行为差异的核心原因
print函数的执行逻辑
print() 在接收任意类型的传入参数时,会自动对非字符串参数做隐式转换:对每个参数调用内置str()方法获取对应的可展示字符串,再把这些字符串拼接输出到目标流。
这个转换触发的正是你在Person类里重写的__str__方法,所以你直接把dan实例传给print时,能正常拿到"my age is 22"的输出内容——print帮你完成了类型转换的步骤。
文件write方法的执行逻辑
以文本模式(wt)打开的文件对象,其write()方法有严格的入参校验规则:只允许接收str类型的参数。
为了避免隐式类型转换带来的非预期写入结果,write方法不会主动对传入的非字符串对象做转换——哪怕这个对象实现了__str__方法,也不会触发调用。你直接传入dan这个Person类实例时,因为入参类型不是str,方法直接抛出TypeError,从始至终都没走到读取__str__返回值的环节。
合规的写入写法
如果需要把实例的__str__返回值写入文件,必须显式完成字符串转换,比如:
fl.write(str(dan)) # 效果和上面完全一致,等价于显式取__str__的返回值写入 fl.write(dan.__str__())
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

