2010-01-16 10 views
13

मेरे पास serialize विधि के साथ एक कस्टम क्लास है, और मैं इस कक्षा को सीधे फाइलों में लिखने में सक्षम होना चाहता हूं और serialize विधि का वापसी मान पाइथन 2.6 में लिखा गया है। (मैं, यह कुछ पूरी तरह से अलग है मेरी वस्तुओं pickle की कोशिश नहीं कर रहा हूँ।) उदाहरण के लिए:पायथन में बफर इंटरफ़ेस को लागू करने के लिए कौन सी विधियां लागू होती हैं?

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 

ठीक मिलता है, तो buffer इंटरफ़ेस को लागू करने के लिए मुझे अपने Foo कक्षा की आवश्यकता है। मैं the buffer documentation में भी देखता हूं कि यह कहता है: "बफर इंटरफ़ेस का एक उदाहरण उपयोगकर्ता फ़ाइल ऑब्जेक्ट की लेखन() विधि है। बफर इंटरफ़ेस के माध्यम से बाइट्स की श्रृंखला निर्यात करने वाली कोई भी ऑब्जेक्ट फ़ाइल में लिखी जा सकती है।"

तो स्पष्ट रूप से मैं जो कर सकता हूं वह कर सकता हूं, लेकिन दस्तावेज़ वास्तव में यह नहीं कहता कि बफर इंटरफेस को लागू करने के लिए मुझे कौन से तरीकों को लागू करने की आवश्यकता है। मैंने __str__, __unicode__, __len__, और यहां तक ​​कि __sizeof__ को लागू करने का प्रयास किया है। मैंने __getitem__, __setitem__, और __delitem__ लागू किया है, int और slice तर्क दोनों को स्वीकार कर लिया है। मैंने बस सुरक्षित होने के लिए बहिष्कृत __getslice__, __setslice__, और __delslice__ विधियों को लागू करने का भी प्रयास किया है। कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, मुझे अभी भी वही अपवाद मिलता है।

>>> 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__'] 

मैं एक एक करके उन सभी को लागू करने से बचना चाहते हैं, और मैं विशेष रूप से बिल्कुल पर दस्तावेज़ प्राप्त करना चाहते हैं:

संदर्भ के लिए, buffer builtin वर्ग के तरीके हैं कौन सी विधियां जरूरी हैं।

क्या यह ऐसा कुछ है जिसे केवल सी एक्सटेंशन कक्षाओं में लागू किया जा सकता है? या क्या मुझे कुछ याद आ रही है?

उत्तर

11

पिकुलियरली, कोई विशेष विधि नहीं है कि शुद्ध-पायथन कोडित कक्षा buffer इंटरफ़ेस का समर्थन करने के लिए सीधे कार्यान्वित कर सकती है - जो PEP 298 होगी, लेकिन इसे वापस ले लिया गया था।

मुझे डर है कि आप कुछ स्पष्ट विशेषता या विधि (या एक अंतर्निहित str जो आंतरिक रूप से एक विशेष प्रणाली को बुलाती है) की तरह file.write & ग :-(करने के लिए अपने वर्ग के उदाहरणों पारित करने के लिए।

+0

का उपयोग करना होगा हूँ हां, इसकी पुष्टि करने के लिए धन्यवाद, मुझे अपने आप कुछ भी नहीं मिला जो स्पष्ट रूप से कहा गया कि आप पाइथन में बफर इंटरफ़ेस को लागू नहीं कर सकते हैं। –

1

प्रलेखन कहते हैं,

अजगर सी में लागू बुलाया कार्यों के एक समूह निर्यात कर सकते हैं "इंटरफेस बफ़र।" वस्तुओं

आपका फू वर्ग सी में लागू नहीं किया गया है, यह ...?

संबंधित मुद्दे