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