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.

¿Cómo invocar métodos en el mismo objeto singleton en Python?

from future import annotations
import cx_Oracle as oracle

class Connection(oracle.Connection):
__connection = None

    @classmethod
    def create(cls) -> Connection:
        """Retorna un objeto singleton de la clase cx_Oracle.Connection."""

        if not cls.__connection:            
            cls.__connection = oracle.connect(
                user="xxx",
                password="xxx",
                dsn="xxx",
                mode=oracle.SYSDBA
            )

        return cls.__connection

“””
Quiero usar un objeto de conexión de base de datos singleton en mi proyecto para evitar crear una conexión más de una vez. En este ejemplo, el método oracle.conexion devuelve la instancia de la clase padre (que es cx_Oracle.Connection).

Mi pregunta es cómo puedo devolver una instancia de Connection (que es la clase que creé) en lugar de la clase cx_Oracle.Connection. Porque quiero invocar algunos métodos en mi objeto singleton, como;

connection = Connection.create()
connection.execute()

Solo mi clase Connection tendrá el método execute, no la clase padre.
“””

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es creando un método envoltorio en tu clase Connection que devuelva una instancia de sí misma en lugar de la clase padre cx_Oracle.Connection. Aquí tienes un ejemplo:

    from __future__ import annotations
    import cx_Oracle as oracle
    
    class Connection:
        __connection = None
    
        def __init__(self, connection: oracle.Connection) -> None:
            self._connection = connection
    
        def execute(self, *args, **kwargs) -> None:
            # Aquí va tu lógica de ejecución
            pass
    
        @classmethod
        def create(cls) -> Connection:
            """Devuelve un objeto Connection singleton."""
    
            if not cls.__connection:
                oracle_connection = oracle.connect(
                    user="xxx",
                    password="xxx",
                    dsn="xxx",
                    mode=oracle.SYSDBA
                )
                cls.__connection = Connection(oracle_connection)
    
            return cls.__connection
    

    En esta actualizada clase Connection, el método create devuelve una instancia de la clase Connection en lugar de la clase padre cx_Oracle.Connection. Lo hace envolviendo la llamada oracle.connect dentro del constructor de Connection y devolviendo la instancia resultante.

    Ahora, cuando llames a Connection.create(), obtendrás una instancia de la clase Connection que tiene el método execute disponible para utilizarlo de esta manera:

    connection = Connection.create()
    connection.execute()
    

Comments are closed.