una str sirve representaci que para modo metodos metodo method especiales español devuelva define clases clase arbol apropiada python

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