प्रिंट () का उपयोग करके कक्षा के उदाहरण कैसे प्रिंट करें?


538

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

<__main__.Foobar instance at 0x7ff2a18c>

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

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

जवाबों:


628
>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

__str__विधि क्या होता है जब आप इसे प्रिंट है, और __repr__विधि क्या होता है जब आप का उपयोग है repr()समारोह (या आप इंटरैक्टिव शीघ्र साथ इसे देख जब)। यदि यह सबसे पाइथोनिक विधि नहीं है, तो मैं माफी चाहता हूं, क्योंकि मैं अभी भी सीख रहा हूं - लेकिन यह काम करता है।

यदि कोई __str__विधि नहीं दी जाती है, तो पायथन __repr__इसके बजाय परिणाम को प्रिंट करेगा । यदि आप परिभाषित करते हैं __str__लेकिन नहीं __repr__, तो पायथन का उपयोग आप ऊपर के रूप में देखते हैं __repr__, लेकिन फिर भी __str__मुद्रण के लिए उपयोग करें ।


11
एक यूनिकोड विधि भी है , जिसका उपयोग आप Str के बजाय कर सकते हैं ; ध्यान दें कि इसे एक यूनिकोड ऑब्जेक्ट वापस करना चाहिए, न कि एक स्ट्रिंग (लेकिन यदि आप एक स्ट्रिंग लौटाते हैं, तो यूनिकोड में रूपांतरण वैसे भी किया जाएगा ...)
kender

@kender - मुझे इसके बारे में पता नहीं था, लेकिन पीछे हटने में यह पाइथन 2.x की टूटी हुई यूनिकोड हैंडलिंग को सही अर्थ देता है।
क्रिस लुट्ज़

11
मुझे लगता है कि इस उत्तर को इस अन्य लिंक के बिना पूरा नहीं किया जा सकता है !
tnotstar

मुझे बचाया! हालांकि, __repr __ (स्वयं) विधि को फिर से लागू करने के बाद, प्रिंट उपयोगकर्ताओं को गुमराह करेगा। क्या आप इसके आस-पास की किसी सर्वोत्तम प्रथा से अवगत हैं?
वियत

10
जावा प्रोग्रामर के लिए: __str __ (स्व) अजगर दुनिया के
स्ट्रिंग

134

जैसा कि क्रिस लुत्ज़ ने उल्लेख किया है , यह __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)

.. यह पायथन शेल में निम्नलिखित कार्य करेगा:

>>> 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))

+1 लेकिन आपका क्लास कोड __str__इंटरएक्टिव शेल के परिणामों से अलग है जो आप देते हैं। : पी
क्रिस लूत्ज

1
त्रुटि, उफ़ .. मैन्युअल रूप से संशोधित REPL आउटपुट कभी भी अच्छी तरह से समाप्त नहीं होता है। मुझे संभवतः अपने पदों पर विचार करना चाहिए: P
dbr

1
%स्ट्रिंग स्वरूपण पदावनत नहीं है, से docs.python.org/whatsnew/2.6.html "% ऑपरेटर है पूरक एक अधिक शक्तिशाली स्ट्रिंग विधि, स्वरूप (फ़ॉर्मेट करके)"
DBR

4
Dbr: यह सच है। ध्यान दें कि "व्हाट्स न्यू इन पाइथन 3.0" डॉक भी कहता है "प्रारूप () विधि [...] योजना अंततः इसे स्ट्रिंग स्वरूपण के लिए केवल एपीआई बनाना है, और पायथन 3.1 में% ऑपरेटर को पदावनत करना शुरू करना है।"
अश्विन नांजप्पा

1
किटी %बहुत सुविधाजनक है।
Janusz Lenar

52

विशिष्ट स्वरूपण के बिना किसी भी वर्ग पर लागू किया जा सकने वाला सामान्य तरीका निम्नानुसार किया जा सकता है:

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

और तब,

elem = Element('my_name', 'some_symbol', 3)
print(elem)

पैदा करता है

__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}

23

यदि आप @Keith जैसी स्थिति में हैं, तो आप कोशिश कर सकते हैं:

print a.__dict__

यह अच्छी शैली पर विचार करता है, लेकिन अगर आप सिर्फ डिबग करने की कोशिश कर रहे हैं, तो यह वही होना चाहिए जो आप चाहते हैं।


क्या आप जानते हैं कि कैसे पता चलेगा कि तानाशाह के पास अपने मूल्यों की वस्तुएं हैं?
प्रणयगोपाल ०२

1
@HadoopEvangelist क्या आप पूछ रहे हैं कि उन वस्तुओं को कैसे प्रिंट किया जाए या यह निर्धारित किया जाए कि क्या वस्तुएं हैं?
जॉन

13

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

"[...] एक स्ट्रिंग को वापस करने के लिए जो एक वस्तु को उसी मूल्य के साथ प्राप्त करेगा जब 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")

लेकिन, जैसा कि मैंने अपनी पिछली टिप्पणी में कहा था: अधिक जानकारी बस यहाँ है !


12

आपको उपयोग करने की आवश्यकता है __repr__। यह एक मानक प्रकार्य है __init__। उदाहरण के लिए:

class Foobar():
    """This will create Foobar type object."""

    def __init__(self):
        print "Foobar object is created."

    def __repr__(self):
        return "Type what do you want to see here."

a = Foobar()

print a

2
repr और str में अलग-अलग शब्दार्थ होते हैं: repr को Python सोर्स होना चाहिए जो कि (re-) एक ही ऑब्जेक्ट बनाएगा - यह कोड में इसका repr esentation है; str ऑब्जेक्ट का एक बहुत ही उपयोगकर्ता-युक्त स्ट्रिंग होना चाहिए।
एरिक टावर्स

12

@ User394430 द्वारा प्रतिक्रिया का एक संक्षिप्त संस्करण

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

नाम और मूल्यों की नेत्रहीन अच्छी सूची तैयार करता है।

<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

एक भी कट्टर संस्करण (धन्यवाद Ruud) आइटम सॉर्ट करता है:

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

8

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

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

इस उत्तर से प्रेरित

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)

1

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

आपको बस यह सुनिश्चित करना है कि आपके पास अपनी कक्षा के अंत में कोष्ठक हैं, जैसे:

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())

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

आशा है कि यह मदद करता है, मुझे पता है अगर आप अब सवाल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.