Ich habe eine benutzerdefinierte Klasse mit einer serialize
-Methode, und ich möchte in der Lage sein, diese Klasse direkt in Dateien schreiben und den Rückgabewert der serialize
-Methode in Python 2.6 geschrieben werden. (Ich bin nicht meine Objekte versuchen, pickle, das etwas ist ganz anders.) Zum Beispiel:Welche Methoden implementieren die Pufferschnittstelle in Python?
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Allerdings, wenn ich diesen Code ausführen, bekomme ich die folgende Ausnahme
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
Okay, also brauche ich meine Foo
Klasse, um die buffer
Schnittstelle zu implementieren. Ich sehe sogar in the buffer documentation, dass es sagt: "Ein Beispiel Benutzer der Pufferschnittstelle ist die write() Methode des Dateiobjekts. Jedes Objekt, das eine Reihe von Bytes durch die Pufferschnittstelle exportieren kann, kann in eine Datei geschrieben werden."
So kann ich anscheinend tun, was ich will, aber die Dokumente sagen nicht wirklich, welche Methoden ich implementieren muss, um die Pufferschnittstelle zu implementieren. Ich habe versucht, __str__
, __unicode__
, __len__
und sogar __sizeof__
zu implementieren. Ich habe __getitem__
, __setitem__
und __delitem__
implementiert und sowohl int
als auch slice
Argumente akzeptiert. Ich habe sogar versucht, die veralteten Methoden __getslice__
, __setslice__
und __delslice__
zu implementieren, nur um sicher zu sein. Egal was ich versuche, bekomme ich immer noch genau die selbe Ausnahme.
Als Referenz sind hier die Methoden der buffer
builtin Klasse:
>>> 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__']
Ich möchte alle von ihnen zu vermeiden, eins nach dem anderen die Umsetzung, und ich würde vor allem die Dokumentation gerne auf genau das finden welche Methoden sind notwendig.
Ist das etwas, das nur in C-Erweiterungsklassen implementiert werden kann? Oder fehlt mir etwas Offensichtliches?
Leider konnte ich, um dies zu bestätigen, nichts alleine finden, das explizit gesagt hat, dass Sie die Pufferschnittstelle in Python nicht implementieren können. –