我有一個serialize
方法的自定義類,我希望能夠將這個類直接寫入文件,並使用Python 2.6編寫返回值爲serialize
的方法。 (我不是要pickle我的對象,這是完全不同的東西。)例如:哪些方法在Python中實現緩衝區接口?
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
然而,當我運行此代碼,我得到下面的異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
好吧,所以我需要我的Foo
類來實現buffer
接口。我甚至在the buffer documentation中看到它說:「緩衝區接口的一個例子是文件對象的write()方法。任何可以通過緩衝區接口輸出一系列字節的對象都可以寫入文件中。
顯然,我可以做我想做的事,但文檔實際上並沒有說我需要實現哪些方法才能實現緩衝區接口。我試過實施__str__
,__unicode__
,__len__
,甚至__sizeof__
。我實施了__getitem__
,__setitem__
和__delitem__
,接受int
和slice
參數。我甚至嘗試過爲了安全而實施已棄用的__getslice__
,__setslice__
和__delslice__
方法。無論我嘗試什麼,我仍然會得到完全相同的例外。
僅供參考,這裏是buffer
內置類的方法:
>>> dir(buffer)
['__add__', '__class__', '__cmp__', '__delattr__', '__delitem__', '__delslice__',
'__doc__', '__format__', '__getattribute__', '__getitem__', '__getslice__',
'__hash__', '__init__', '__len__', '__mul__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__',
'__setslice__', '__sizeof__', '__str__', '__subclasshook__']
我想避免一個個實現所有的人,我特別想找到準確的文檔哪些方法是必要的。
這是隻能在C擴展類中實現的東西嗎?還是我錯過了明顯的東西?
唉,謝謝你的確認,我自己找不到明確表示你不能在Python中實現緩衝區接口的東西。 – 2010-01-16 23:42:35