logo cosasdedevs

Crear una instancia de una clase mediante un string con Python

Crear una instancia de una clase mediante un string con Python

My Profile
May 21, 2020

¡Hola! El tutorial de hoy es un tutorial cortito pero que espero que os pueda ayudar en vuestro aprendizaje en Python. Vamos a ver cómo crear una instancia de una clase mediante un string con Python, de esta forma, podremos instanciar clases de forma dinámica y en ciertos casos nos vendrá bien para crear un código más limpio 💪.

Para ello, lo primero que haremos, será crear una clase para realizar las pruebas con un contenido muy sencillo en el que pasaremos un nombre por el constructor y tendrá un método que imprimirá un saludo.

saludar.py

class Saludo:

    def __init__(self, nombre):
        self.nombre = nombre

    def saludar(self):
        print(f'¡Hola {self.nombre}!')


Ahora que tenemos la clase creada, vamos a crear otro archivo que será desde donde crearemos una instancia de la clase mediante un string.

main.py

from saludar import Saludo
from pprint import pprint

class_name = 'Saludo'
param = 'Alber'

m = globals()[class_name](param)
m.saludar()

pprint(globals())

Como veis, para instanciar la clase, utilizamos la función globals(). Esta devuelve un diccionario con las variables definidas en el namespace global. Cuando llamamos a globals desde una función o método, devuelve un diccionario que representa al namespace global del módulo donde se define la función o método, no desde donde se llama.

Al ser un diccionario, le pasamos como clave el nombre de la clase y los parámetros los enviamos como si estuviéramos creando una instancia de la clase de la forma habitual.

Este sería un ejemplo del output:

{
    'Saludo': <class 'saludar.Saludo'>,
    '__annotations__': {},
    '__builtins__': <module 'builtins' (built-in)>,
    '__cached__': None,
    '__doc__': None,
    '__file__': 'main.py',
    '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001C80B66D108>,
    '__name__': '__main__',
    '__package__': None,
    '__spec__': None,
    'class_name': 'Saludo',
    'm': <saludar.Saludo object at 0x000001C80B7E1448>,
    'param': 'Alber',
    'pprint': <function pprint at 0x000001C80B660F78>
}

En él se puede ver la importación de la clase y las variables que hemos definido.

Y listo, con esto ya podemos instanciar objetos de forma dinámica 💪.

Recordad que si queréis estar al tanto cada vez que suba nuevo contenido, podéis seguirme en mi Twitter donde os informaré cada vez que suba nuevos tutoriales.

Nos leemos 👋

249 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!