¿Cómo definir un método __str__ para una clase?

En Python, la clase de object sirve como la superclase raíz para todas las clases (estilo nuevo). Como mínimo, al aplicar str y repr a la “instancia de clase” de cualquier subclase de object obtiene el mismo resultado:

 >>> class spam(object): pass ... >>> str(spam) "" >>> str(spam) == repr(spam) 

Me gustaría definir una subclase de object , digamos fancyobject , que es idéntico a object en todos los sentidos, excepto que la aplicación de str y repr en fancyobject produce diferentes salidas:

 >>> class ham(fancyobject): pass ... >>> str(ham) 'ham' >>> repr(ham) "" 

¿Hay una manera de hacer esto en Python?

PD: Soy consciente del método especial __str__ , pero tengo entendido que si la clase A reemplaza a __str__ , entonces se llama al método que prevalece solo cuando se llama a str en instancias de A , no cuando se llama a A sí. Es decir:

 >>> class A(object): ... def __str__(self): ... return 'from new __str__: ' + object.__str__(self) ... >>> str(A()) 'from new __str__: ' >>> str(A) "" 

En realidad, el mismo mecanismo que para las instancias de objetos se aplica a los tipos. Los tipos son solo objetos en sí mismos, por lo que se convierten en cadenas llamando al __str__() en su tipo, que se denomina “metaclase”. Así que tienes que sobrescribir el __str__() en la metaclase:

 class fancytype(type): def __str__(self): return self.__name__ class ham(object): __metaclass__ = fancytype print ham 

huellas dactilares

 ham 

También puede establecer la metaclase predeterminada para un módulo completo como este

 class fancytype(type): def __str__(self): return self.__name__ __metaclass__ = fancytype class ham: pass print ham