Introducción
En este artículo, aprenderás sobre los métodos especiales __str__()
y __repr__()
que están definidos en el modelo de datos de Python. Los métodos __str__()
y __repr__()
pueden ser útiles en la depuración del código Python mediante el registro o la impresión de información útil sobre un objeto.
Los métodos especiales de Python comienzan y terminan con un doble guion bajo y se conocen informalmente como métodos dunder. Los métodos dunder son los métodos subyacentes para los operadores y funciones integrados de Python. Deberías evitar llamar directamente a los métodos dunder, y en su lugar implementar los métodos dunder en tu clase y luego usar las funciones integradas que los llaman, como str()
y repr()
.
¿Cuál es la diferencia entre __str__()
y __repr__()
?
El método __str__()
devuelve una representación de cadena legible para humanos, o informal, de un objeto. Este método es llamado por las funciones integradas print()
, str()
, y format()
. Si no defines un método __str__()
para una clase, entonces la implementación de objeto integrada llama al método __repr__()
en su lugar.
El método __repr__()
devuelve una representación de cadena más rica en información, o oficial, de un objeto. Este método es llamado por la función integrada repr()
. Si es posible, la cadena devuelta debería ser una expresión válida de Python que pueda ser utilizada para recrear el objeto. En todos los casos, la cadena debería ser informativa y no ambigua.
En general, la cadena __str__()
está destinada a los usuarios y la cadena __repr__()
está destinada a los desarrolladores.
__str__()
y __repr__()
Ejemplos Usando una Clase Incorporada
Los ejemplos en esta sección llaman a los métodos __str__()
y __repr__()
directamente con fines de demostración.
La clase datetime.datetime
es una clase incorporada de Python que tiene una implementación predeterminada de los métodos __str__()
y __repr__()
.
El siguiente código de ejemplo muestra las cadenas devueltas por la implementación predeterminada de los métodos __str__()
y __repr__()
para un objeto datetime.datetime
:
import datetime
mydate = datetime.datetime.now()
print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))
print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))
La salida es:
Output__str__() string: 2023-01-27 09:50:37.429078
str() string: 2023-01-27 09:50:37.429078
__repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
La salida muestra que la función str()
llama a __str__()
y devuelve una cadena fácil de entender para los humanos, mientras que la función repr()
llama a __repr__()
y devuelve una cadena más rica en información que se puede utilizar para recrear el objeto. De hecho, puedes usar la función repr()
con la función eval()
para crear un nuevo objeto a partir de la cadena:
import datetime
mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))
print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))
print("the values of the objects are equal: ", mydate1==mydate2)
La salida es:
Outputmydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
the values of the objects are equal: True
El código de ejemplo anterior crea el objeto mydate2
a partir de la cadena repr()
de mydate1
, y luego verifica que los valores de ambos objetos sean iguales.
Ejemplos de __str__()
y __repr__()
usando una nueva clase
Cuando creas una clase, deberías implementar al menos el método __repr__()
para que se devuelva información útil cuando las funciones integradas utilicen __repr__()
.
La siguiente clase no implementa los métodos __str__()
o __repr()__
:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
La salida cuando usas str()
y repr()
es:
Output<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
El ejemplo anterior demuestra que la implementación predeterminada de `__repr()__` para el objeto devuelve una cadena con solo la clase y el objeto `id` en formato hexadecimal, lo cual no es muy útil. Ten en cuenta que `str()` y `repr()` devuelven el mismo valor, porque `str()` llama a `__repr__()` cuando `__str__()` no está implementado.
Actualiza la clase Ocean con las implementaciones de los métodos `__str__()` y `__repr__()`:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
def __str__(self):
return f'The creature type is {self.name} and the age is {self.age}'
def __repr__(self):
return f'Ocean(\'{self.name}\', {self.age})'
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
El resultado es:
OutputThe creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
La implementación de `__str__()` en el ejemplo anterior devuelve una cadena fácil de leer que proporciona los detalles relevantes del objeto para un usuario. La implementación de `__repr__()` devuelve una cadena que es una expresión Python válida que podría usarse para recrear el objeto: `Ocean(‘Jellyfish’, 5)`. El ejemplo utiliza formato de cadena f para las cadenas, pero puedes formatear las cadenas utilizando cualquier formato admitido por Python.
Conclusión
En este artículo, exploraste las diferencias entre los métodos __str__()
y __repr__()
e implementaste estos métodos especiales en una clase, de modo que no necesitabas llamarlos directamente. Obtén más información sobre cómo trabajar con cadenas en Python a través de nuestros tutoriales de cadenas en Python.
Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions