Tôi có một lớp tùy chỉnh với phương thức serialize
và tôi muốn có thể ghi lớp này trực tiếp vào tệp và có giá trị trả về của phương thức serialize
được viết bằng Python 2.6. (Tôi không cố gắng để pickle đối tượng của tôi, đây là một cái gì đó hoàn toàn khác nhau.) Ví dụ:Phương pháp nào thực hiện giao diện đệm trong Python?
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Tuy nhiên, khi tôi chạy mã này, tôi nhận được ngoại lệ sau đây
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
Được rồi, vì vậy tôi cần lớp học Foo
của mình để triển khai giao diện buffer
. Tôi thậm chí còn thấy trong the buffer documentation rằng nó nói: "Một người dùng ví dụ về giao diện đệm là phương thức write() của đối tượng tệp. Bất kỳ đối tượng nào có thể xuất một chuỗi byte thông qua giao diện bộ đệm đều có thể được ghi vào một tệp."
Vì vậy, rõ ràng tôi có thể làm những gì tôi muốn, nhưng các tài liệu không thực sự nói những phương pháp tôi cần phải thực hiện để thực hiện giao diện đệm. Tôi đã thử triển khai __str__
, __unicode__
, __len__
và thậm chí __sizeof__
. Tôi đã triển khai __getitem__
, __setitem__
và __delitem__
, chấp nhận cả hai đối số int
và slice
. Tôi thậm chí đã thử triển khai các phương pháp __getslice__
, __setslice__
và __delslice__
không được chấp nhận để an toàn. Cho dù tôi có cố gắng gì đi nữa, tôi vẫn nhận được chính xác cùng một ngoại lệ.
Để tham khảo, đây là các phương thức của lớp được xây dựng trong 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__']
Tôi muốn tránh thực hiện tất cả trong số họ từng người một, và tôi đặc biệt muốn tìm các tài liệu về chính xác phương pháp nào là cần thiết.
Đây có phải là thứ chỉ có thể được triển khai trong các lớp mở rộng C không? Hoặc tôi thiếu một cái gì đó hiển nhiên?
Than ôi, cảm ơn để xác nhận điều này, tôi không thể tìm thấy bất cứ điều gì một mình nói rõ ràng rằng bạn không thể thực hiện giao diện đệm trong Python. –