Considera esta clase:
class foo(object):
pass
La representación de cadena predeterminada se parece a esto:
>>> str(foo)
"<class '__main__.foo'>"
¿Cómo puedo hacer que esta pantalla sea una cadena personalizada?
Implementar __str__()o __repr__()en la metaclase de la clase.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Úselo __str__si se refiere a una stringificación legible, úselo __repr__para representaciones inequívocas.
_representational cuerpo de la clase yreturn self._representationen el__repr__()método de la metaclase.__repr__para representarC. Una alternativa a tener un_representationmiembro es crear una fábrica de metaclases que produzca una metaclase con la adecuada__repr__(esto podría ser bueno si está usando esto mucho).fuente
instancesla clase, no para la clase en sí.Si tiene que elegir
__repr__o elegir__str__el primero, como por defecto__str__llama a la implementación__repr__cuando no se definió.Ejemplo de Vector3 personalizado:
En este ejemplo,
reprdevuelve nuevamente una cadena que se puede consumir / ejecutar directamente, mientras questres más útil como salida de depuración.fuente
__repr__vs__str__es correcto, esto no responde a la pregunta real, que se trata de objetos de clase, no de instancias.La respuesta aprobada de Ignacio Vázquez-Abrams es bastante correcta. Sin embargo, es de la generación Python 2. Una actualización para el actual Python 3 sería:
Si desea código que se ejecute tanto en Python 2 como en Python 3, el módulo seis lo tiene cubierto:
Finalmente, si tiene una clase en la que desea tener una reproducción estática personalizada, el enfoque basado en la clase anterior funciona muy bien. Pero si tiene varios, tendría que generar una metaclase similar a la
MCde cada uno, y eso puede ser agotador. En ese caso, llevar su metaprogramación un paso más allá y crear una fábrica de metaclases hace las cosas un poco más limpias:huellas dactilares:
La metaprogramación no es algo que generalmente necesita todos los días, pero cuando lo necesita, ¡realmente da en el clavo!
fuente
Solo agregando a todas las buenas respuestas, mi versión con decoración:
stdout:
Los inconvenientes:
Csin una superclase (noclass C:)Clas instancias serán instancias de alguna derivación extraña, por lo que probablemente sea una buena idea agregar también una__repr__para las instancias.fuente