2012-02-09 8 views
7

Capisco il seguente codice Python:Python: __str__, ma per una classe, non un'istanza?

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

Ora, vorrei cambiare l'uscita di

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

quale funzione devo sovraccarico deve essere in grado di farlo? La soluzione deve funzionare anche se la classe non viene mai istanziata. La situazione è diversa in Python 2.xe 3?

+0

Vi siete [controllare] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = ricerca) per esistere risposte prima di chiedere? –

+0

possibile duplicato di [Come definire un metodo __str__ per una classe?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

Ho provato , ma in realtà non l'ho trovato. – user1199915

risposta

10

Definire __str__() sul metaclasse:

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

Ora, print A stamperà plonk.

Edit: Come notato da jsbueno nei commenti, in Python 3.x si avrebbe bisogno di fare quanto segue:

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

Anche in Python 2.x potrebbe essere un'idea migliore per definire il metaclass all'esterno del corpo della classe: ho scelto il modulo nidificato in alto per risparmiare un po 'di digitazione.

+1

Come O.P. chiede della compatibilità con Python 3, dovrebbe indicare che Python 3 non supporta questa forma di assegnazione di un metaclasse, poiché il "metaclass" viene passato come se fosse un parametro di parole chiave nella dichiarazione di classe. (quindi, il metaclasse deve essere definito prima del corpo della classe) – jsbueno

+0

@jsbueno: Grazie, hai perso quella domanda. –

+0

Hai [controllato] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = search) per i duplicati prima di rispondere? –

6

Definire il metodo __repr__ sul Metaclasse:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
Problemi correlati