¿La función `str ()` de python llama a la función `__str __ ()` de una clase?

Si defino una clase con su propia función __str__() , ¿es str(a) equivalente a a.__str__() , donde a es una instancia de mi clase?

Revisé el documento de Python , no dice explícitamente que este es el caso.

Respuesta corta: ¡Sí!


De acuerdo con los documentos de Python ( resalté la parte relevante):

object.__str__(self)

Llamado por str (objeto) y las funciones incorporadas format () e print () para calcular la representación de cadena “informal” o bien imprimible de un objeto. El valor de retorno debe ser un objeto de cadena.

Este método difiere del object.__repr__() en que no hay expectativa de que __str__() devuelva una expresión de Python válida: se puede usar una representación más conveniente o concisa.

La implementación predeterminada definida por el tipo de objeto incorporado llama al object.__repr__() .

Entonces, your_instance.__str__ generalmente se llama cuando haces str(your_instance) .


Respuesta más larga: con “Métodos especiales” (los métodos con dos guiones bajos y dos guiones bajos) hay una excepción porque se buscan en la clase, no en la instancia. Entonces, str(a) es en realidad el type(a).__str__(a) y no a.__str__() . Pero en la mayoría de los casos, estos son los mismos, porque rara vez se anulan los métodos de la clase en la instancia. Especialmente no métodos especiales.

Vea también la documentación relevante en “Búsqueda de métodos especiales” :

Para las clases personalizadas, solo se garantiza que las invocaciones implícitas de métodos especiales funcionen correctamente si se definen en el tipo de un objeto , no en el diccionario de instancia del objeto .

Entonces, como @zzh1996 señaló en los comentarios, el siguiente código usará el método definido en la clase, aunque la instancia tiene un atributo __str__ llamada personalizable:

 >>> class A(object): ... def __str__(self): ... return 'a' >>> instance = A() >>> instance.__str__ = lambda: 'b' >>> str(instance) 'a' >>> instance.__str__() 'b' 

Si lo hace Echa un vistazo al siguiente ejemplo:

 >>> class A: ... def __init__(self, a): ... self.a = a ... def __str__(self): ... print "Inside __str__" ... return self.a ... >>> >>> a = A('obj1') >>> a <__main__.A instance at 0x0000000002605548> >>> >>> a.__str__() Inside __str__ 'obj1' >>> >>> str(a) Inside __str__ 'obj1' 

Y, de la documentación __str__() , tenemos:

object.__str__(self)

Llamado por str(object) y las funciones incorporadas format() e print() para calcular la representación de cadena “informal” o bien imprimible de un objeto. El valor de retorno debe ser un objeto de cadena.

Sí, pero también en la impresión. Consulte los documentos https://docs.python.org/2/reference/datamodel.html#object. str