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.
_representation
al cuerpo de la clase yreturn self._representation
en el__repr__()
método de la metaclase.__repr__
para representarC
. Una alternativa a tener un_representation
miembro 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
instances
la 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,
repr
devuelve nuevamente una cadena que se puede consumir / ejecutar directamente, mientras questr
es 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
MC
de 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:
C
sin una superclase (noclass C:
)C
las 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