2011-02-08 14 views
128

इस वर्ग पर विचार करें:क्लास ऑब्जेक्ट के लिए कस्टम स्ट्रिंग प्रस्तुति कैसे बनाएं?

class foo(object): 
    pass 

डिफ़ॉल्ट स्ट्रिंग प्रस्तुति इस तरह कुछ दिखती है:

>>> str(foo) 
"<class '__main__.foo'>" 

मैं इस डिस्प्ले को कस्टम स्ट्रिंग कैसे बना सकता हूं?

उत्तर

173

लागू __str__() या __repr__() वर्ग के metaclass में।

class MC(type): 
    def __repr__(self): 
    return 'Wahaha!' 

class C(object): 
    __metaclass__ = MC 

print C 

उपयोग __str__ आप एक पठनीय stringification मतलब है, स्पष्ट अभ्यावेदन के लिए __repr__ का उपयोग करें।

+2

मैं किसी प्रकार का वर्ग सजावट बनाना चाहता हूं, इसलिए मैं आसानी से अपने वर्गों के लिए कस्टम स्ट्रिंग प्रस्तुतिकरण सेट कर सकता हूं, जिनमें से प्रत्येक के लिए मेटाक्लास नहीं लिखा जा सकता है। मैं पाइथन के मेटाक्लास से बहुत परिचित नहीं हूं, तो क्या आप मुझे कोई संकेत दे सकते हैं? –

+0

दुर्भाग्यवश यह कक्षा सजावट के साथ नहीं किया जा सकता है; कक्षा निर्धारित होने पर इसे सेट किया जाना चाहिए। –

+9

@ Space_C0wb0y: आप क्लास बॉडी में '_representation' जैसे स्ट्रिंग जोड़ सकते हैं और मेटाक्लास के' __repr __() 'विधि में' self._representation 'लौटा सकते हैं। –

14
class foo(object): 
    def __str__(self): 
     return "representation" 
    def __unicode__(self): 
     return u"representation" 
+4

यह मेरी समस्या का समाधान नहीं करता है। मैंने प्रदान किया गया कोड आज़माएं। –

+8

यह कक्षा के 'उदाहरण' के लिए स्ट्रिंग प्रस्तुति को बदलता है, न कि वर्ग के लिए। – tauran

+0

क्षमा करें, आपकी पोस्ट का दूसरा भाग नहीं दिखता है। ऊपर विधि का प्रयोग करें। –

1

आप का चयन करने के __repr__ या __str__ के बीच, पहले एक के लिए जाने के डिफ़ॉल्ट कार्यान्वयन __str__ कॉल __repr__ जब यह परिभाषित नहीं किया गया था के रूप में है।

कस्टम Vector3 उदाहरण:

class Vector3(object): 
    def __init__(self, args): 
     self.x = args[0] 
     self.y = args[1] 
     self.z = args[2] 

    def __repr__(self): 
     return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) 

    def __str__(self): 
     return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

इस उदाहरण में, repr रिटर्न फिर से एक स्ट्रिंग है सीधे सेवन किया जा सकता/निष्पादित, जबकि str एक डिबग आउटपुट के रूप में अधिक उपयोगी है।

v = Vector3([1,2,3]) 
print repr(v) #Vector3([1,2,3]) 
print str(v)  #Vector(x:1, y:2, z:3) 
+0

जबकि '__repr__' बनाम' __str__' के बारे में आपका बिंदु सही है, यह वास्तविक प्रश्न का उत्तर नहीं देता है, जो कि है वर्ग वस्तुओं, उदाहरण नहीं। –

+0

प्रतिक्रिया के लिए धन्यवाद, पूरी तरह से उस पर नजर डालें। मुझे मेरे जवाब की समीक्षा करने दें। – user1767754

+0

मुझे लगता है कि आप repr और str के लिए कार्यान्वयन swapped हैं। – jspencer

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