2011-02-08 8 views

Respuesta

173

Implementar __str__() o __repr__() en metaclase de la clase.

class MC(type): 
    def __repr__(self): 
    return 'Wahaha!' 

class C(object): 
    __metaclass__ = MC 

print C 

Uso __str__ Si se refiere a una stringification legible, utilice __repr__ para las representaciones inequívocas.

+2

Me gustaría crear algún tipo de decorador de clases, así puedo establecer fácilmente representaciones de cadenas personalizadas para mis clases sin tener que escribir una metaclase para cada una de ellas. No estoy muy familiarizado con las metaclases de Python, así que ¿puedes darme algún apuntador? –

+0

Desafortunadamente esto no se puede hacer con decoradores de clase; debe establecerse cuando la clase está definida. –

+9

@ Space_C0wb0y: Puede agregar una cadena como '_representation' al cuerpo de la clase y' return self._representation' en el método '__repr __()' de la metaclase. –

14
class foo(object): 
    def __str__(self): 
     return "representation" 
    def __unicode__(self): 
     return u"representation" 
+4

Esto no resuelve mi problema. Pruebe el código que proporcioné. –

+8

Esto cambia la representación de cadena para 'instances' de la clase, no para la clase misma. – tauran

+0

lo siento, no ve la segunda parte de su publicación. Usa el método de arriba –

1

Si tiene que elegir entre __repr__ o __str__ vaya para el primero, ya que la implementación predeterminada __str__ llama al __repr__ cuando no estaba definido.

ejemplo Vector3 personalizado:

class Vector3(object): 
    def __init__(self, args): 
     self.x = args[0] 
     self.y = args[1] 
     self.z = args[2] 

    def __repr__(self): 
     return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) 

    def __str__(self): 
     return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

En este ejemplo, repr vuelve de nuevo una cadena que puede ser consumido directamente/ejecutado, mientras que str es más útil como un resultado de la depuración.

v = Vector3([1,2,3]) 
print repr(v) #Vector3([1,2,3]) 
print str(v)  #Vector(x:1, y:2, z:3) 
+0

Si bien su punto acerca de '__repr__' vs' __str__' es correcto, esto no responde a la pregunta real, que trata sobre class-objects, no instancias. –

+0

Gracias por los comentarios, completamente supervisado. Déjame revisar mi respuesta. – user1767754

+0

Creo que las implementaciones para repr y str se intercambian. – jspencer

Cuestiones relacionadas