2010-01-16 55 views
13

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____delitem__, chấp nhận cả hai đối số intslice. Tôi thậm chí đã thử triển khai các phương pháp __getslice__, __setslice____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?

Trả lời

11

Đặc biệt, không có phương pháp đặc biệt nào mà lớp mã hóa thuần-Python có thể triển khai trực tiếp để hỗ trợ giao diện buffer - có thể là PEP 298 nhưng đã bị rút.

Tôi sợ bạn sẽ phải sử dụng một số thuộc tính rõ ràng hoặc phương pháp (hoặc một built-in như str mà trong nội bộ gọi một phương pháp đặc biệt) để vượt qua trường hợp của lớp học của bạn để file.write & c :-(.

+0

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. –

1

Các tài liệu cho biết,

Python đối tượng thực hiện trong C có thể xuất một nhóm các chức năng gọi là “đệm giao diện.”

lớp Foo của bạn không được thực hiện trong C, là nó ...?

Các vấn đề liên quan