2009-12-31 6 views
88
def __repr__(self): 
    return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name, 
    self.namespace, self.regex.pattern) 

इस विधि का महत्व/उद्देश्य क्या है?पायथन के __repr__

+0

@ zjm1126: आप को पता है 'क्यों करता है >>> variable' प्रिंट क्या' __repr __() 'रिटर्न चाहते हो? – voyager

+11

वह दस्तावेज लोगों को सोते हैं। इसके अलावा, दूसरों से सीखना उपयोगी होता है कि इसका उपयोग कैसे किया जाता है। – Dombey

+0

पाइथन में \ _ \ _ str \ _ \ _ और \ _ \ _ repr \ _ \ _ के बीच अंतर का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1436703/difference-between-str-and-repr- इन-पायथन) –

उत्तर

116

__repr__ इस ऑब्जेक्ट को बनाने के लिए संभवतः एक ऑब्जेक्ट का एक प्रिंट करने योग्य प्रतिनिधित्व वापस करना चाहिए। आधिकारिक दस्तावेज़ीकरण here देखें। __repr__ डेवलपर्स के लिए अधिक है जबकि __str__ अंतिम उपयोगकर्ताओं के लिए है।

एक साधारण उदाहरण:

>>> class Point: 
... def __init__(self, x, y): 
...  self.x, self.y = x, y 
... def __repr__(self): 
...  return 'Point(x=%s, y=%s)' % (self.x, self.y) 
>>> p = Point(1, 2) 
>>> p 
Point(x=1, y=2) 
+2

आलसी 1 देखें: मैं मुख्य रूप से स्वरूपण को ठीक करना चाहता था (उदाहरण के लिए उदाहरण के साथ जितना संभव हो सके मिलान करना उपयोगी है वे नमूना सत्र में क्या देखेंगे), लेकिन मैंने आउटपुट प्रारूप को स्पष्ट रूप से असाइनमेंट से अलग करने के लिए tweaked किया, क्योंकि इससे इस पर उलझन में किसी के लिए स्पष्टता में सुधार होता है, imho। (यदि मैं दूर तक गया हूं, तो बस पुनः संपादित करें, और मैं आपको एक बियर देना चाहूंगा।) –

+2

संदर्भ को छोड़ दिया गया: http://docs.python.org/reference/datamodel.html#object.__repr__ –

+1

यह शायद% s के बजाय% r का उपयोग करना चाहिए: http://stackoverflow.com/questions/6005159/when-to-use-r-instead-of-s-in-python –

11

यह Python documentation में बहुत अच्छी तरह से समझाया गया है:

रेपर (वस्तु): एक स्ट्रिंग एक वस्तु का एक मुद्रण योग्य प्रतिनिधित्व युक्त लौटें। रूपांतरणों (रिवर्स उद्धरण) द्वारा उत्पन्न यह वही मूल्य है। यह कभी-कभी सामान्य ऑपरेशन के रूप में इस ऑपरेशन तक पहुंचने में सक्षम होने के लिए उपयोगी होता है। कई प्रकार के लिए, यह फ़ंक्शन एक स्ट्रिंग को वापस करने का प्रयास करता है जो eval() को पारित होने पर एक ही मान के साथ एक वस्तु उत्पन्न करेगा, अन्यथा प्रतिनिधित्व कोण ब्रैकेट में संलग्न एक स्ट्रिंग है जिसमें ऑब्जेक्ट के प्रकार का नाम एक साथ होता है ऑब्जेक्ट के नाम और पते सहित अक्सर अतिरिक्त जानकारी के साथ। एक वर्ग यह नियंत्रित कर सकता है कि यह फ़ंक्शन __repr __() विधि को परिभाषित करके अपने उदाहरणों के लिए क्या करता है।

तो आप जो देख रहे हैं वह __repr__ का डिफ़ॉल्ट कार्यान्वयन है, जो क्रमबद्धकरण और डिबगिंग के लिए उपयोगी है।

+5

मुझे लगता है कि किसी ऑब्जेक्ट का "प्रतिनिधित्व" प्राप्त करने के रिवर्स कोट्स (या 'बैकटिक्स') को हटा दिया गया है, और संस्करण 3.0 – MatrixFrog

+0

मैट्रिक्सफ्रोग के लिए हटा दिया गया था: दोनों सत्य, लेकिन वर्तमान 2.x दस्तावेज़ अभी भी कहते हैं यह, जहां उद्धरण है। –

+0

कई ऑब्जेक्ट्स के लिए, _ \ _ repr _ \ _ और _ \ _ str _ \ _ एक ही फ़ंक्शन हैं। वास्तव में, यदि आप केवल _ \ _ str _ \ _ को परिभाषित करते हैं, तो _ \ _ repr _ \ _ केवल _ \ _ str _ \ _ को कॉल करने के लिए डिफ़ॉल्ट है।सबसे स्पष्ट मामला जहां यह सत्य नहीं है, खुद को तार कर रहा है: str ('stackoverflow') 'stackoverflow' देता है लेकिन repr ('stackoverflow') 'stackoverflow' है। – MatrixFrog

4

__repr__ विधि बस अजगर बताता है कि कैसे एक वर्ग

5

__repr__ की वस्तुओं मुद्रित करने के लिए स्टैंडअलोन अजगर दुभाषिया द्वारा किया जाता है प्रिंट करने योग्य प्रारूप में एक वर्ग प्रदर्शित करने के लिए। उदाहरण:

~> python3.5 
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class StackOverflowDemo: 
...  def __init__(self): 
...   pass 
...  def __repr__(self): 
...   return '<StackOverflow demo object __repr__>' 
... 
>>> demo = StackOverflowDemo() 
>>> demo 
<StackOverflow demo object> 

ऐसे मामलों में जहां एक __str__ विधि कक्षा में परिभाषित नहीं है, यह एक मुद्रण योग्य प्रतिनिधित्व पैदा करने की कोशिश में __repr__ समारोह कॉल करेंगे।

>>> str(demo) 
'<StackOverflow demo object __repr__>' 
इसके अतिरिक्त

, print() वर्ग ing डिफ़ॉल्ट रूप से __str__ कॉल करेंगे।


Documentation, अगर आप कृपया

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