是否可以编写Python类,使其可以传递给write()?

时间:2019-02-26 21:40:06

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

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

mine = MyClass()

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

    f.write(mine)

我尝试实施__bytes__无济于事。我知道缓冲协议,但是我相信只能通过C API来实现(尽管我确实看到了关于委托给实现该协议的基础对象的讨论。)

1 个答案:

答案 0 :(得分:3)

不,您不能,没有可以实现的特殊方法来使您的Python类支持缓冲协议。

是的,io.RawIOBase.write()io.BufferedIOBase.write()方法说明它们接受bytes-like object,但是制作某些东西 {{1 }}类 is a C-level protocol only。有一个open Python issue to add Python hooks,但尚未取得任何进展。

只有将对象传递给bytes可调用对象时,才会调用__bytes__ special methodbytes()不会这样做。

因此,在写入文件时,仅接受实际的类似.write()的对象,其他所有必须首先转换为此类对象。我会坚持:

bytes

,它将调用with open('Test.txt', 'wb') as f: f.write(bytes(mine)) 方法(如果已定义),或在您的类上提供一种导致其将自身写入文件对象的方法:

MyClass.__bytes__()