representaci - para que sirve__ str__ en python
¿Cómo definir un método__str__ para una clase? (2)
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)
"<class ''__main__.spam''>"
>>> str(spam) == repr(spam)
Me gustaría definir una subclase de object , digamos fancyobject , que es idéntico al object en todos los fancyobject , excepto que la aplicación de str y repr en fancyobject produce diferentes salidas:
>>> class ham(fancyobject): pass
...
>>> str(ham)
''ham''
>>> repr(ham)
"<class ''__main__.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 el método que prevalece se llama 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__: <__main__.A object at 0x7f79c62a5310>''
>>> str(A)
"<class ''__main__.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