首页 > 解决方案 > 为什么 python file-write 不会隐式调用类 __str__?

问题描述

为什么 Python 的文件写入不会自动调用__str__

$ cat person.py
class Person:
    def __init__(self):
        self.age = 22
    def __str__(self):
        return "my age is {}".format(self.age)

当我尝试打印它时,一切正常,但写入Person文件失败:

>>> from person import Person
>>> dan = Person()
>>> print(dan)
my age is 22
>>> fl = open("dan.txt","wt")
>>> fl.write(dan)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not Person

标签: pythonstring

解决方案


这根本不是 API 的设计方式。

的定义object.__str__(self)

由 str(object) 和内置函数 format() 和 print() 调用,以计算对象的“非正式”或可打印的字符串表示。

除了那些明确列出的实例之外,没有理由期望会发生隐式转换。

并且根据的定义io.TextIOBase.write(s)

将字符串 s 写入流并返回写入的字符数。

所以它明确地期待一个字符串,这由错误消息确认。

最简单的解决方案是在将函数作为参数str()传递之前使用函数执行转换:write()

fl.write(str(dan))

推荐阅读