2009-05-04 7 views
6

मैं एक अतिरिक्त विशेषता के साथ एक स्ट्रिंग चाहता हूं, मान लीजिए कि इसे लाल या हरे रंग में प्रिंट करना है या नहीं।मेरी कक्षा पर स्ट्रिंग-नेस कैसे प्रदान करें?

उपclassing (str) काम नहीं करता है, क्योंकि यह अपरिवर्तनीय है। मैं मूल्य देखता हूं, लेकिन यह परेशान हो सकता है।

एकाधिक उत्तराधिकारी सहायता कर सकते हैं? मैंने कभी इसका इस्तेमाल नहीं किया।

केवल ऑब्जेक्ट को डालने और self.value = str का उपयोग करने का अर्थ है मुझे सभी स्ट्रिंग-नेस संदेशों (जैसे स्ट्रिप) को स्वयं लागू करना है।

या रूबी के missing_method की तरह उन्हें आगे बढ़ाने का कोई तरीका है?

मुझे लगता है कि कलर स्टोर करने के लिए अनुक्रमित एक वर्ग-स्तरीय शब्दकोश का उपयोग कर काम कर सकता है। बहुत बदसूरत?

उत्तर

6

str जब तक आप एक बहुत पुरानी अजगर संस्करण उपयोग कर रहे विरासत में मिला जा सकता है उदाहरण के लिए,:

>>> class A(str): 
... def __new__(cls, color, *args, **kwargs): 
...  newobj = str.__new__(cls, *args, **kwargs) 
...  newobj.color = color 
...  return newobj 
>>> a = A("#fff", "horse") 
>>> a.color 
'#fff' 
>>> a 
'horse' 
>>> a.startswith("h") 
True 
+3

यह अच्छा है। लेकिन आपको इस दृष्टिकोण से सावधान रहना होगा। यदि आपने कोई स्ट्रिंग ऑपरेशन किया है (शीर्षक(), +, ...) परिणाम टाइप स्ट्रेट ए –

+0

होगा, मैं इस धारणा के तहत था कि यह ठीक से काम नहीं करेगा, इसलिए सवाल। बाहर निकलता है यह मेरे __new__ में एक पोग्रामिंग त्रुटि थी और मैंने पाइथन के अपर्याप्त संदेश की गलत व्याख्या की। – Tobias

2

शायद में एक कस्टम क्लास एक स्ट्रिंग बेहतर दृष्टिकोण होगी। क्या आपको वास्तव में अंतर्निहित स्ट्रिंग के माध्यम से सभी स्ट्रिंग विधियों को पारित करने की आवश्यकता है? एक संपत्ति के माध्यम से स्ट्रिंग का पर्दाफाश क्यों न करें और कक्षा के उपभोक्ताओं को जो भी चाहें वह करने की अनुमति दें?

0

आपको स्ट्रिंग के सभी तरीकों की आवश्यकता है, इसलिए स्ट्रिंग का विस्तार करें और अपने अतिरिक्त विवरण जोड़ें। तो क्या होगा अगर स्ट्रिंग अपरिवर्तनीय है? बस अपनी कक्षा को अपरिवर्तनीय बनाएं। फिर आप नई वस्तुओं को बना रहे हैं, इसलिए आप गलती से यह सोचकर गड़बड़ नहीं करेंगे कि यह एक परिवर्तनीय वस्तु है।

या, यदि पाइथन में एक है, तो स्ट्रिंग का एक परिवर्तनीय संस्करण बढ़ाएं। मैं पाइथन के साथ पर्याप्त परिचित नहीं हूं कि यह संरचना मौजूद है या नहीं।

2
import UserString 
class mystr(UserString.MutableString): 
    ... 

यह आम तौर पर सबसे अच्छा & उपवर्गों उसके अपरिवर्तनीय तार का उपयोग करने के लिए, लेकिन आप एक परिवर्तनशील भी इस की जरूरत है इसे पाने का सबसे आसान तरीका है।

+0

यह पाइथन 2.2 –

+0

के बाद से हटा दिया गया है UserString क्लास 2.2 में बहिष्कृत किया गया था, लेकिन MutableString क्लास को 2.6 में केवल बहिष्कृत किया गया था - http://docs.python.org/library/userdict.html देखें - यदि आप निश्चित हैं आप 2.6 या बाद में उपयोग करने जा रहे हैं, एक विस्थापन स्ट्रिंग को नए बाइटियर प्रकार (बाइट्स के परिवर्तनीय सरणी) के शीर्ष पर लागू किया जा सकता है। –

0

आप PyPI में stringlike मॉड्यूल का उपयोग करने का प्रयास कर सकते हैं। यहां an example है।

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