में उप-वर्ग सेट करते समय __repr__ को परिभाषित करना, मैं नीचे दिए गए कोड का उपयोग करके पाइथन में set
ऑब्जेक्ट को उपclass करने का प्रयास कर रहा हूं, लेकिन मैं उपयोग करने के लिए __repr__
की समझदार परिभाषा नहीं कर सकता।पाइथन
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
मैं इस तरह से है कि मैं निम्नलिखित उत्पादन प्राप्त कर सकते हैं में __repr__
परिभाषित करने के लिए करना चाहते हैं:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
हालांकि, अगर मैं __repr__
ओवरराइड नहीं करते, उत्पादन मैं name
पर ध्यान नहीं देता मूल्य ...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
... जबकि अगर मैं __repr__
ओवरराइड करते हैं, मैं नहीं समूह में मान के लिए सीधी पहुँच एक नया सेट उदाहरण बनाकर बिना प्राप्त कर सकते हैं:
यह काम करता है, लेकिन __repr__
है कि तब का निपटारा किया जाएगा के लिए एक नया सेट उदाहरण बनाकर मेरे लिए भद्दा और अक्षम लगता है।
क्या इस तरह के वर्ग के लिए __repr__
परिभाषित करने का एक बेहतर तरीका है?
संपादित करें: एक और समाधान जो मेरे साथ हुआ है: मैं स्थानीय रूप से सेट स्टोर कर सकता हूं। यह अन्य विकल्पों की तुलना में थोड़ा साफ दिखता है (__repr__
के प्रत्येक कॉल के लिए कुछ बनाना और नष्ट करना या स्ट्रिंग मैनिपुलेशन के कुछ रूपों का उपयोग करना), लेकिन फिर भी मेरे लिए आदर्श से कम लगता है।
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
self._set = set(s)
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, self._set)
जिस तरह से आप फोन 'super' लिए, आप अगर subclasses '__init__' को कॉल करने का प्रयास करते हैं तो अनंत रिकर्सन प्राप्त करें। कारण 'सुपर' स्पष्ट रूप से कक्षा लेता है कि यह जानता है कि विधि समाधान आदेश (एमआरओ) में कहां जारी रखना है। 'अल्फा' पास करें (या यदि टैग संकेत के रूप में यह 3.x है, तो बस 'सुपर() 'का उपयोग करें - यह किसी भी तरह से सही चीज करता है)। – delnan
@ डेलनान: डांग। उसके लिए धन्यवाद। और मुझे लगता था कि कक्षा स्पष्ट रूप से निर्दिष्ट करने से बचने में मुझे चालाक था। –
@ डेलनान: किसी कारण से, स्वेन मार्नच ने इस सवाल को पायथन 3.x के रूप में टैग किया। मैं वास्तव में पायथन 2.6 का उपयोग कर रहा हूँ। –