2012-02-09 13 views
7

entiendo el siguiente código Python:Python: __str__, pero para una clase, ¿no es una instancia?

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

Ahora, me gustaría cambiar la salida de

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

que funcionan necesito para sobrecargar a ser capaz de hacer eso? La solución tiene que funcionar incluso si la clase nunca se crea una instancia. ¿La situación es diferente en Python 2.xy 3?

+0

¿Ha [revisado] (http://stackoverflow.com/search?q= [Python] +% +% 2Bclass 2Bstr y publica = búsqueda) por existir respuestas antes de preguntar? –

+0

posible duplicado de [¿Cómo definir un método __str__ para una clase?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

Probé , pero en realidad no lo encontró. – user1199915

Respuesta

10

Definir __str__() en la metaclase:

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

Ahora, print A imprimirá plonk.

Editar: Como se ha señalado por jsbueno en los comentarios, en Python 3.x que tendría que hacer lo siguiente:

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

Incluso en Python 2.x que podría ser una mejor idea de definir la metaclase fuera del cuerpo de la clase: elegí el formulario anidado arriba para guardar algo de tipeo.

+1

Cuando O.P. pregunta sobre la compatibilidad con Python 3, debería indicar que Python 3 no admite esta forma de asignar una metaclase, ya que la "metaclase" se pasa como si fuera un parámetro de palabra clave en la declaración de clase. (Entonces, la metaclase debe definirse antes del cuerpo de la clase) – jsbueno

+0

@jsbueno: Gracias, se perdió esa pregunta. –

+0

¿Ha [verificado] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = search) los duplicados antes de responder? –

6

Definir el método __repr__ en su clase meta:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
Cuestiones relacionadas