2009-04-07 10 views
77

जावा में, यदि मैं List.toString() को कॉल करता हूं, तो यह सूची के अंदर प्रत्येक ऑब्जेक्ट पर स्वचालित रूप से toString() विधि को कॉल करेगा। उदाहरण के लिए, अपनी सूची में शामिल है, तो O1, O2, और ओ 3, list.toString() वस्तुओं कुछ इस तरह दिखेगा:पायथन __str__ और

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]" 

वहाँ एक रास्ता अजगर में समान व्यवहार प्राप्त करने के लिए है? मेरी कक्षा में एक __str __() विधि लागू किया, लेकिन जब मैं वस्तुओं की एक सूची का प्रिंट आउट, का उपयोग करते हुए: अजगर

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>] 

मैं कैसे प्राप्त कर सकते हैं कॉल करने के लिए:

print 'my list is %s'%(list) 

यह कुछ इस तरह दिखता सूची के अंदर प्रत्येक तत्व के लिए स्वचालित रूप से मेरा __str__ (या उस मामले के लिए dict)?

+0

कृपया अपनी कक्षा परिभाषा प्रदान करें। –

उत्तर

105

एक पायथन सूची पर कॉलिंग स्ट्रिंग प्रत्येक तत्व के अंदर __repr__ विधि को कॉल करती है। कुछ वस्तुओं के लिए, __str__ और __repr__ समान हैं। आपको लगता है कि व्यवहार चाहते हैं, करते हैं:

def __str__(self): 
    ... 
def __repr__(self): 
    return self.__str__() 
+5

'__repre__' के साथ' __str__' की पहचान करना आमतौर पर [पायथन डेटा मॉडल] (https://docs.python.org/2/reference/datamodel.html#object.__repr__) से सहमत नहीं है, इसलिए सूची समझ समाधान प्रस्तावित @ daniel-lew द्वारा अधिक पायथन है। –

+0

कोई तर्क नहीं। मैंने सवाल के जवाब में जवाब दिया, जो प्रायः पाइथन के लिए एक नवागत समस्या के बारे में सोचना चाहता है, लेकिन इसका मतलब यह नहीं है कि इसका उत्तर देने का सबसे अच्छा तरीका है। –

+0

पायथन अपने स्वयं के डेटा मॉडल के अनुरूप होना चाहिए और सभी प्राइमेटिव्स और समेककों के लिए एक ही चीज़ करना चाहिए। –

16

आप एक list comprehension का उपयोग प्रत्येक आइटम str के साथ एक नई सूची (उत्पन्न करने के लिए कर सकते हैं) 'डी स्वचालित रूप से:

print([str(item) for item in mylist]) 
+4

या बस 'प्रिंट (मानचित्र (str, mylist)) - यह एक छोटा सा छोटा – anula

+1

है इसके साथ एक समस्या यह है कि यदि मेरी सूची में आइटम भी एक सूची हो सकता है –

3

दो आसान चीजें आप, उपयोग कर सकते हैं map फ़ंक्शन या समझ का उपयोग करें।

लेकिन यह आपको स्ट्रिंग की स्ट्रिंग की सूची नहीं देता है। तो आपको तारों को एक साथ जोड़ना होगा।

s= ",".join(map(str, myList)) 

या

s= ",".join([ str(element) for element in myList ]) 

तो फिर तुम इस समग्र स्ट्रिंग वस्तु मुद्रित कर सकते हैं।

print 'my list is %s'%(s) 
3

क्या आप के लिए है कि उत्पादन का उपयोग करना चाहते पर निर्भर करता है, शायद __repr__ अधिक उपयुक्त हो सकता है:

import unittest 

class A(object): 
    def __init__(self, val): 
     self.val = val 

    def __repr__(self): 
     return repr(self.val) 

class Test(unittest.TestCase): 
    def testMain(self): 
     l = [A('a'), A('b')] 
     self.assertEqual(repr(l), "['a', 'b']") 

if __name__ == '__main__': 
    unittest.main() 
3

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

def is_list(value): 
    if type(value) in (list, tuple): return True 
    return False 

def list_str(value): 
    if not is_list(value): return str(value) 
    return [list_str(v) for v in value] 

बस मस्ती के लिए, मैंने सूची में निहित सब कुछ (list) (-) recursively str() बनाया है।

+0

+1 यह '__str__' और' __repr__' अलग से – Apelsin

1

आप प्रारूप का उपयोग कर सकते हैं।

def __str__(self): 
     return("my list is".format(self.list1)) 
संबंधित मुद्दे