Objetos anónimos en Python

Muhammad Maisam Abbas 8 octubre 2023
  1. Crear objetos anónimos con la clase namedtuple en Python
  2. Crea objetos anónimos con la función type() en Python
Objetos anónimos en Python

Este tutorial discutirá los métodos para crear objetos anónimos en Python.

Crear objetos anónimos con la clase namedtuple en Python

Un objeto anónimo es solo un valor sin un nombre real. Por lo tanto, se llama Anónimo.

A veces es más fácil crear un objeto anónimo para contener valores que definir una clase completamente nueva.

De forma predeterminada, el lenguaje de programación Python, a diferencia de C# y Java, no admite clases anónimas de forma nativa. Pero, con un poco de creatividad, podemos encontrar una solución e imitar la funcionalidad de los objetos anónimos.

Para empezar, podemos utilizar la clase namedtuple dentro del módulo colecciones de Python para imitar objetos anónimos. El siguiente código demuestra cómo podemos crear objetos anónimos usando la clase namedtuple de Python.

from collections import namedtuple

anonymousClass = namedtuple("variables", ["foo", "woo", "boo"])

obj1 = anonymousClass(foo=1, woo=2, boo="3")
obj1.boo

Producción :

'3'

Primero inicializamos la tupla con nombre anonymousClass con namedtuple("variables", ['foo', 'woo', 'boo']. En el constructor, pasamos un par clave/valor donde el valor es una lista de nombres de variables en los que terminaremos almacenando nuestros valores temporales.

En nuestro caso de uso, lo que sea que pasemos como clave del constructor no tiene mucho efecto en nuestro resultado. Ahora podemos usar este objeto anonymousClass para crear objetos anónimos con obj1 = anonymousClass(foo=1, woo=2, boo='3').

Lo bueno de este método es que el objeto anonymousClass es reutilizable, y podemos crear tantos objetos anónimos como queramos. La principal desventaja de este enfoque es que necesitamos conocer el número de variables mientras inicializamos la tupla con nombre.

Crea objetos anónimos con la función type() en Python

Otra forma de declarar un objeto anónimo es con la función type() en Python. La función type() toma 3 parámetros; el nombre del nuevo tipo de datos, el tipo de datos de los valores que contiene y un conjunto de valores.

El siguiente fragmento de código demuestra cómo podemos imitar el comportamiento de los objetos anónimos con la función type() en Python.

obj = type("", (object,), {"foo": 1, "woo": 2, "boo": "3"})()
obj.boo

Producción :

'3'

En el código anterior, pasamos una cadena vacía al primer parámetro de la función tipo(), que corresponde al nombre del nuevo tipo de datos. El segundo parámetro es el tipo de datos especificado como objeto.

El tercer parámetro es un conjunto de valores dados en pares clave/valor donde la clave es el nombre de la variable y el valor es su valor correspondiente. En comparación con nuestro enfoque anterior, este enfoque tiene sus ventajas y desventajas.

La desventaja obvia aquí es que no podemos reutilizar el obj para inicializar más objetos anónimos, a diferencia de anonymousClass en el ejemplo anterior. La ventaja de este enfoque es que podemos especificar más variables sin declararlas primero.

Esta función type() se puede modificar para incorporar nuevos valores sin especificar primero su nombre usando dict en lugar del tipo de datos object. El siguiente fragmento de código nos muestra el funcionamiento de este método.

obj3 = type("", (dict,), {"foo": 1, "woob": 2})()
obj3.boo = 123
obj3.boo

Producción :

123

En el código anterior, reemplazamos el objeto del ejemplo anterior con dict.

Ambos métodos discutidos anteriormente tienen sus ventajas y desventajas entre sí. Ninguno de ellos es un claro ganador, y cuál depende de nuestro caso de uso.

Si ya sabemos la cantidad de valores que terminaremos almacenando, pero necesita varios objetos anónimos, el método namedtuple funcionaría mejor. Si no sabemos el número de valores pero solo necesitamos uno o dos objetos anónimos, el método type() sería mejor.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Python Object