2012-02-09 10 views
7

मैं निम्नलिखित पायथन कोड को समझने:पायथन: __str__, लेकिन एक वर्ग के लिए, उदाहरण नहीं?

>>> class A(object): 
...  def __str__(self): 
...   return "An instance of the class A" 
... 
>>> 
>>> a = A() 
>>> print a 
An instance of the class A 

अब, मैं

>>> print A 
<class '__main__.A'> 

कौन सा कार्य करते हैं मुझे लगता है कि ऐसा करने में सक्षम होने के लिए ओवरलोड करने की आवश्यकता है के उत्पादन में बदलने के लिए चाहते हैं? समाधान को तब भी काम करना पड़ता है जब वर्ग कभी भी तत्काल नहीं होता है। क्या स्थिति पायथन 2.x और 3 में अलग है?

+0

क्या आपने [चेक किया गया] (http://stackoverflow.com/search?q= [अजगर]% 2Bclass +% 2Bstr & = खोज पेश करें) मौजूदा के लिए पूछने से पहले जवाब? –

+0

संभावित डुप्लिकेट [कक्षा के लिए __str__ विधि को कैसे परिभाषित करें?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

मैंने कोशिश की , लेकिन वास्तव में यह नहीं मिला। – user1199915

उत्तर

10

metaclass पर परिभाषित __str__():

class A(object): 
    class __metaclass__(type): 
     def __str__(self): 
      return "plonk" 

अब, print Aplonk प्रिंट होगा।

संपादित:

class Meta(type): 
    def __str__(self): 
     return "plonk" 
class A(metaclass=Meta): 
    pass 

यहां तक ​​कि अजगर 2.x में यह एक बेहतर विचार परिभाषित करने के लिए हो सकता है: टिप्पणी में jsbueno द्वारा बताया गया है, अजगर 3.x में आपको निम्न कार्य करने की आवश्यकता होगी कक्षा निकाय के बाहर मेटाक्लास - मैंने कुछ टाइपिंग को बचाने के लिए उपरोक्त नेस्टेड फॉर्म चुना है।

+1

ओ.पी. पाइथन 3 संगतता के बारे में पूछताछ के रूप में, यह बोनोट किया जाना चाहिए कि पायथन 3 मेटाक्लास को असाइन करने के इस रूप का समर्थन नहीं करता है, क्योंकि "मेटाक्लास" पास किया जाता है जैसे कि यह कक्षा घोषणा में एक कीवर्ड पैरामीटर है। (इसलिए, मेटाक्लास को कक्षा निकाय के समक्ष परिभाषित किया जाना चाहिए) – jsbueno

+0

@jsbueno: धन्यवाद, उस प्रश्न को याद किया। –

+0

क्या आपने जवाब दिया है (http://stackoverflow.com/search?q= [पायथन] +% 2Bclass +% 2Bstr और सबमिट = खोज) जवाब देने से पहले डुप्लिकेट के लिए? –

6

अपने मेटा वर्ग पर __repr__ विधि को परिभाषित करें:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
संबंधित मुद्दे