[Python] प्रिंट () का उपयोग कर वर्ग की कक्षा या वस्तुओं को कैसे मुद्रित करें?



Answers

जैसा कि क्रिस लुट ने उल्लेख किया था , यह आपकी कक्षा में __repr__ विधि द्वारा परिभाषित किया गया है।

repr() के प्रलेखन से:

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

निम्नलिखित कक्षा परीक्षण को देखते हुए:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, self.b)

..it पाइथन खोल में निम्न तरीके से कार्य करेगा:

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

यदि कोई __str__ विधि परिभाषित नहीं की गई है, तो print(t) (या print(str(t)) ) इसके बजाय __repr__ के परिणाम का उपयोग करेगा

यदि कोई __repr__ विधि परिभाषित नहीं की गई है तो डिफ़ॉल्ट का उपयोग किया जाता है, जो काफी बराबर है ..

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))
Question

मैं पाइथन में रस्सी सीख रहा हूँ। जब मैं print() फ़ंक्शन का उपयोग कर कक्षा Foobar की ऑब्जेक्ट मुद्रित करने का प्रयास करता हूं, तो मुझे इस तरह का आउटपुट मिलता है:

<__main__.Foobar instance at 0x7ff2a18c>

क्या कोई तरीका है कि मैं एक वर्ग और इसकी वस्तुओं के मुद्रण व्यवहार (या स्ट्रिंग प्रस्तुति ) को सेट कर सकता हूं? उदाहरण के लिए, जब मैं क्लास ऑब्जेक्ट पर print() को कॉल करता हूं, तो मैं अपने डेटा सदस्यों को एक निश्चित प्रारूप में प्रिंट करना चाहता हूं। पायथन में इसे कैसे प्राप्त करें?

यदि आप सी ++ कक्षाओं से परिचित हैं, तो कक्षा के लिए friend ostream& operator << (ostream&, const Foobar&) विधि जोड़कर मानक ostream लिए उपरोक्त प्राप्त किया जा सकता है।




पायथन 3 के लिए:

यदि विशिष्ट प्रारूप महत्वपूर्ण नहीं है (उदाहरण के लिए डीबगिंग के लिए) बस नीचे प्रिंट करने योग्य वर्ग से प्राप्त होता है। प्रत्येक वस्तु के लिए कोड लिखने की जरूरत नहीं है।

this जवाब से प्रेरित हो गया

class Printable:
    def __repr__(self):
        from pprint import pformat
        return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)

# Example Usage
class MyClass(Printable):
    pass

my_obj = MyClass()
my_obj.msg = "Hello"
my_obj.number = "46"
print(my_obj)



इस धागे में पहले से ही बहुत सारे जवाब हैं लेकिन उनमें से कोई भी विशेष रूप से मेरी मदद नहीं करता है, मुझे इसे खुद से बाहर करना पड़ा, इसलिए मुझे उम्मीद है कि यह थोड़ा और जानकारीपूर्ण होगा।

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

print(class())

यहां एक प्रोजेक्ट से कोड का एक उदाहरण दिया गया है जिस पर मैं काम कर रहा था:

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
    def __str__(self):
        return "{}: {}\nAtomic Number: {}\n".format(self.name, self.symbol, self.number

class Hydrogen(Element):
    def __init__(self):
        super().__init__(name = "Hydrogen", symbol = "H", number = "1")

मेरे हाइड्रोजन वर्ग को मुद्रित करने के लिए, मैंने निम्न का उपयोग किया:

print(Hydrogen())

कृपया ध्यान दें, यह हाइड्रोजन के अंत में कोष्ठक के बिना काम नहीं करेगा। वे जरूरी हैं।

उम्मीद है कि इससे मदद मिलती है, अगर आपको और सवाल हैं तो मुझे बताएं।




बस मेरे दो सेंट को @ डीबीआर के उत्तर में जोड़ने के लिए, इस वाक्य को आधिकारिक दस्तावेज से उद्धृत करने का एक उदाहरण निम्नलिखित है:

"[...] एक स्ट्रिंग को वापस करने के लिए जो एक वस्तु को उसी मूल्य के साथ उपज करेगी जब eval (), [...]"

इस वर्ग परिभाषा को देखते हुए:

class Test(object):
    def __init__(self, a, b):
        self._a = a
        self._b = b

    def __str__(self):
        return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

    def __repr__(self):
        return 'Test("%s","%s")' % (self._a, self._b)

अब, Test क्लास के उदाहरण को क्रमबद्ध करना आसान है:

x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

तो, कोड के अंतिम भाग को चलाते हुए, हम पाएंगे:

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

लेकिन, जैसा कि मैंने अपनी आखिरी टिप्पणी में कहा था: अधिक जानकारी here !






Links