Saltar al contenido

Manera correcta de escribir la función __repr__ con herencia

Deseamos mostrarte la mejor respuesta que hemos encontrado en todo internet. Nosotros deseamos que te sea de mucha ayuda y si quieres comentarnos alguna mejora hazlo libremente.

Solución:

Bueno el __repr__ tiene un significado especial en el modelo de datos de Python:

object.__repr__(self)

Llamado por el repr() función incorporada para calcular el “oficial” string representación de un objeto. Si es posible, debería verse como una expresión de Python válida que podría usarse para recrear un objeto con el mismo valor (dado un entorno apropiado). Si esto no es posible, un string de la forma <...some useful description...> debe ser devuelto. El valor de retorno debe ser un string objeto. Si una clase define __repr__() pero no __str__()entonces __repr__() también se utiliza cuando un “informal” string se requiere la representación de instancias de esa clase.

Esto se usa normalmente para la depuración, por lo que es importante que la representación sea rica en información y sin ambigüedades.

Eso significa que string que es devuelto por __repr__ debería ser utilizable para crear otro objeto como este. Entonces __repr__ es algo que Muy a menudo necesita superarse, no debido a la __class__.__name__ sino porque el “estado” tiene que ser captado en la representación.

class A(object):
    def __init__(self, param):
        self._param = param

    def __repr__(self):
        '''Returns representation of the object'''
        return("(!r)".format(self.__class__.__name__, self._param))

Entonces absolutamente debería anular el __repr__ cuando agrega parámetros para __init__:

class B(A):
    def __init__(self, param1, param2):
        self._param = param1
        self._param2 = param2

    def __repr__(self):
        '''Returns representation of the object'''
        return("(!r)".format(self.__class__.__name__, self._param, self._param2))

Pero en caso de que el __repr__ de la superclase todavía precisamente “describe” la subclase, entonces no tiene sentido sobrecargar la __repr__:

class B(A):
     pass

Sin embargo, siempre es una buena opción usar self.__class__.__name__ sobre codificar el nombre de la clase, en caso de que usted u otra persona lo subclase.

Reseñas y calificaciones

Si estás contento con lo expuesto, tienes el poder dejar un enunciado acerca de qué le añadirías a este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *