【问题标题】:Can a Python class be written such it may be passed to write()?可以编写 Python 类以便将其传递给 write() 吗?
【发布时间】:2026-02-23 13:55:02
【问题描述】:

我想将我的类的一个实例传递给 write() 并将其写入文件。底层数据只是一个字节数组。

mine = MyClass()

with open('Test.txt', 'wb') as f:

    f.write(mine)

我尝试实现__bytes__ 无济于事。我知道缓冲区协议,但我相信它只能通过 C API 来实现(尽管我确实看到了对实现该协议的底层对象的委托)。

【问题讨论】:

    标签: python python-3.x file-io byte


    【解决方案1】:

    不,你不能,没有可以实现的特殊方法可以让你的 Python 类支持缓冲区协议。

    是的,io.RawIOBase.write()io.BufferedIOBase.write() 方法记录了它们接受 bytes-like object,但是缓冲区协议需要制作一些东西bytes-like is a C-level protocol only。有一个open Python issue to add Python hooks,但在这方面没有取得任何进展。

    __bytes__ special method 仅在您将对象传递给 bytes() 可调用对象时被调用; .write() 不会这样做。

    因此,当写入文件时,只接受实际的类似bytes 的对象,其他所有内容必须首先转换为这样的对象。我会坚持:

    with open('Test.txt', 'wb') as f:
        f.write(bytes(mine))
    

    它将调用MyClass.__bytes__() 方法,前提是它已定义,或者在您的类上提供一个方法,使其将自身写入文件对象:

    with open('Test.txt', 'wb') as f:
        mine.dump(f)
    

    【讨论】:

    • 谢谢。很棒的细节。
    最近更新 更多