es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Clases creadas dinámicamente con el mismo nombre

Estoy intentando crear dinámicamente subclases en Python con type:

class A:
    @classmethod
    def create_subclass(cls, name, attrs):
        return type(name, (cls,), attrs)

for i in range(5):
    x = A.create_subclass("B", {"func": abs})

print(A.__subclasses__())

y esto es lo que veo en la salida:

[<class '__main__.b'="">, <class '__main__.b'="">, <class '__main__.b'="">, <class '__main__.b'="">, <class '__main__.b'="">]

Obviamente, ese no era mi intención.
Dos preguntas al respecto:

  1. ¿Cómo maneja Python múltiples clases con nombres idénticos?
  2. ¿Cuál es una forma “pythonic” de manejarlo? Por supuesto, puedo buscar el nombre en las subclases ya existentes, pero ¿cómo manejar los espacios de nombres/módulos?
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Creación dinámica de subclases en Python

    1. ¿Cómo maneja Python múltiples clases con nombres idénticos?

    Python permite crear múltiples clases con nombres idénticos. Cuando se crean varias clases con nombres idénticos, se sobrescriben entre sí dependiendo del orden en el que se definieron. En el fragmento de código proporcionado, cada instancia de la clase B creada dinámicamente usando type se llama B. Como no se proporciona un identificador único para cada nueva subclase, Python crea una nueva clase con el mismo nombre B cada vez que se itera el bucle. Por lo tanto, obtenemos una lista de cinco clases idénticas.

    2. ¿Cuál es una forma “pythonic” de manejarlo?

    Para evitar y manejar la creación de múltiples clases con el mismo nombre, podemos utilizar un identificador único para cada nueva subclase. Una forma de generar identificadores únicos es utilizar UUIDs (IDs universalmente únicos). Aquí tienes un ejemplo:

    import uuid
    
    class A:
        @classmethod
        def create_subclass(cls, attrs):
            name = f'B_{str(uuid.uuid4()).split("-")[-1]}'
            return type(name, (cls,), attrs)
    
    for i in range(5):
        x = A.create_subclass({"func": abs})
    
    print(A.__subclasses__())
    

    En este ejemplo, utilizamos el módulo uuid para generar un identificador único, lo concatenamos al nombre de la subclase (B_) y creamos la subclase utilizando type(). La salida de este código sería una lista de cinco clases únicas.

    En cuanto a los espacios de nombres/módulos, podemos definir nuestras subclases creadas dinámicamente en un módulo separado o definirlas dentro de una clase o función con un espacio de nombres único. Esto ayuda a evitar conflictos de nombres y mantiene el código organizado.

Comments are closed.