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