Foros del Web » Programando para Internet » Python »

duda con herencia y con decoradores(novato)

Estas en el tema de duda con herencia y con decoradores(novato) en el foro de Python en Foros del Web. Hola, aqui estoy de nuevo, con mis dudas de novato en este aprendizaje de python. Miren, tengo lo siguiente: Código PHP: class  conexion (object): .... ...
  #1 (permalink)  
Antiguo 26/05/2010, 10:42
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
duda con herencia y con decoradores(novato)

Hola, aqui estoy de nuevo, con mis dudas de novato en este aprendizaje de python.

Miren, tengo lo siguiente:
Código PHP:
class conexion(object):
....
    
def realizarConexion(self):
        
def _realizarConexion(f):
            
def inner(*args):
                
error f(*args)
                
self.cursorCerrar()
                
self.conexionCerrar()
                return 
error                   
            
return inner
        
return _realizarConexion
.... 
y tengo una segunda clase:
Código PHP:
from dato.conexion import conexion
class tabla1(conexion):
...
    @
conexion.realizarConexion(self)
    
def insert(self, *informacion):
        for 
i in informacion:
            
conexion.conexionSentencia(self,'insert into tabla1 (informacion) VALUES (%s)',i)
        
error conexion.conexionCommit(self)
        return 
error
... 
Y me marca error en esta línea:
@conexion.realizarConexion(self)

lanza el mensaje "NameError: name 'self' is not defined"

he intentado @conexion.realizarConexion(self), funcion decoradora sin parametros, y combinaciones de estos, pero al parecer, el problema supera mis pocos conocimientos de python.

mi duda es, puedo crear un decorador en la clase padre, para así decorar funciones de la clase hija?
de momento la funcion de la clase padre nada hace, pero tendrá más código


Espero puedan ayudarme. Saludos

P.D. en resumidas cuentas, me gustaria saber como decorar una funcion de una clase

Última edición por refreegrata; 26/05/2010 a las 11:25
  #2 (permalink)  
Antiguo 26/05/2010, 12:25
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: duda con herencia y con decoradores(novato)

Ya, miren, me olvide un poco de los decoradores. Voy a intentar harcelo de otra forma.
Ahora tengo lo siguiente:
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
import psycopg2
class conexion(object):
    
''' clase para conectar '''

    
def __init__(self):
        
self.__host 'localhost'
        
self.__dbname 'asdasdsad'
        
self.__user 'asdsadsa'
        
self.__password 'sadsad'
        
# self.__conexion
        # self.__cursor
#------------------------------------------------------------------------------------
#--------------------------------------CONEXION--------------------------------------
#------------------------------------------------------------------------------------
    
def conexionAbrir(self):
        
''' abrir conexion '''
        
try:
            
self.__conexion psycopg2.connect('host='+self.__host+' dbname='+self.__dbname+' user='+self.__user+' password='+self.__password)
        
except:
            return 
False
        
return True

    def conexionCerrar
(self):
        
''' cerrar conexion '''
        
try:
            
self.__conexion.close()
        
except:
            return 
False
        
return True

    def conexionSentencia
(selfinstruccion, *parametro):
        
''' ejecutar sentencia '''
        
try:
            
self.__cursor.execute(instruccionparametro)
        
except:
            return 
False
        
return True

    def conexionCommit
(self):
        try:
            
self.__conexion.commit()
        
except:
            return 
False
        
return True

    def conexionRollback
(selfcommit True):
        try:
            
self.__cursor.rollback()
        
except:
            return 
False
        
return True
#------------------------------------------------------------------------------------
#---------------------------------------CURSOR---------------------------------------
#------------------------------------------------------------------------------------
    
def cursorAbrir(self):
        
''' crear cursor '''
        
try:
            
self.__cursor self.__conexion.cursor()
        
except:
            return 
False
        
return True

    def cursorCerrar
(self):
        
''' cerrar cursor '''
        
try:
            
self.__cursor.close()
        
except:
            return 
False
        
return True

    def cursorFetchall
(self):
        try:
            return 
self.__cursor.fetchall()
        
except:
            return 
False

    def cursorFetchmany
(selfdimension):
        try:
            return 
self.__cursor.fetchmany(dimension)
        
except:
            return 
False

    def cursorFetchone
(self):
        try:
            return 
self.__cursor.fetchone()
        
except:
            return 
False

    def getCursor
(self):
        return 
self.__cursor

    cursor 
property(getCursor
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
from dato.conexion import conexion
class tabla1(conexion):
    
''' clase para conectar a tabla '''

    
def __init__(self):
        
conexion.__init__(self)

    
def sentencia(selff, *args, **kw_args):
        if 
conexion.conexionAbrir(self) and conexion.cursorAbrir(self):
            
error f(*args, **kw_args)
        else:
            
error True
        conexion
.cursorCerrar(self)
        
conexion.conexionCerrar(self)
        return 
error

    def insert
(self, *informacion):
        return 
self.sentencia(self.__insert,*informacion)
    
    
def __insert(self, *informacion):
        for 
i in informacion:
            
conexion.conexionSentencia(self,'insert into tabla1 (informacion) VALUES (%s)',i)
        return 
conexion.conexionCommit(self)

    
def update(self, *informacion, **restriccion):
        
pass

ab 
tabla1()
ab.insert("ai","oi"
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
from dato.conexion import conexion
class tabla2(conexion):
    
''' clase para conectar a tabla '''

    
def __init__(self):
        
conexion.__init__(self)

    
def sentencia(selff, *args, **kw_args):
        if 
conexion.conexionAbrir(self) and conexion.cursorAbrir(self):
            
error f(*args, **kw_args)
        else:
            
error True
        conexion
.cursorCerrar(self)
        
conexion.conexionCerrar(self)
        return 
error

    def insert
(self, *informacion):
        return 
self.sentencia(self.__insert,*informacion)

    
def __insert(self, *informacion):
        for 
i in informacion:
            
conexion.conexionSentencia(self,'insert into tabla2 (informacion1,informacion2,numero) VALUES (%s,%s,%s)',*i)
        return 
conexion.conexionCommit(self)

ab tabla2()
ab.insert(("a","b",1),("c","d",2),("e","f",3)) 
Basicamente cree una funcion sentencia, para evitarme en cada funcion en donde debiera realizar un sentencia sql el hacer
if conexion.conexionAbrir(self) and conexion.cursorAbrir(self):
error = trabajar(parametros)
else:
error = True
conexion.cursorCerrar(self)
conexion.conexionCerrar(self)
return error
Código PHP:
    def sentencia(selff, *args, **kw_args):
        if 
conexion.conexionAbrir(self) and conexion.cursorAbrir(self):
            
error f(*args, **kw_args)
        else:
            
error True
        conexion
.cursorCerrar(self)
        
conexion.conexionCerrar(self)
        return 
error 
como ven, esta funcion solo recibe los parametros y el nombre de la funcion que realizará la sentencia deseada(insert,update,select...)
el problema, como verán, es que debo volver a escribir la funcion sentencia en cada una de la clases que son herencia de conexion(tabla1, tabla2)

Mio duda es: ¿existe alguna manera de definir esa funcion en un solo lugar, sin tener que copiarla en cada clase hija?

he tratado de usar wrap, meterla en la clase padre(conexion), pero no me funciona, y no se que pudiera estar haciendo mal

No se si hay solución. Espero puedan ayudarme, y disculpen lo torpe de mi codigo(recien empeze con python, y llevaba mucho tiempo programando en un lenguaje no orientado a objetos, o sea C)

Saludos
  #3 (permalink)  
Antiguo 31/05/2010, 07:50
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: duda con herencia y con decoradores(novato)

al final hice una clase intermedia, llamada sentencia, ubicada entre conexion, y las clases de las tablas. Pensé que no funcionaría, pero en realidad si sirve
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
import psycopg2
class conexion(object):
    
''' clase para conectar '''

    
def __init__(self):
        
self.__host 'localhost'
        
self.__dbname 'codificacion'
        
self.__user 'postgres'
        
self.__password '12345'
        
# self.__conexion
        # self.__cursor
#------------------------------------------------------------------------------------
#--------------------------------------CONEXION--------------------------------------
#------------------------------------------------------------------------------------
    
def conexionAbrir(self):
        
''' abrir conexion '''
        
try:
            
self.__conexion psycopg2.connect('host='+self.__host+' dbname='+self.__dbname+' user='+self.__user+' password='+self.__password)
        
except:
            return 
False
        
return True

    def conexionCerrar
(self):
        
''' cerrar conexion '''
        
try:
            
self.__conexion.close()
        
except:
            return 
False
        
return True

    def conexionCommit
(self):
        try:
            
self.__conexion.commit()
        
except:
            return 
False
        
return True

    def conexionRollback
(selfcommit True):
        try:
            
self.__conexion.rollback()
        
except:
            return 
False
        
return True
#------------------------------------------------------------------------------------
#---------------------------------------CURSOR----------------------------------------
#------------------------------------------------------------------------------------

    
def cursorAbrir(self):
        
''' crear cursor '''
        
try:
            
self.__cursor self.__conexion.cursor()
        
except:
            return 
False
        
return True

    def cursorCerrar
(self):
        
''' cerrar cursor '''
        
try:
            
self.__cursor.close()
        
except:
            return 
False
        
return True

    def cursorFetchall
(self):
        try:
            return 
self.__cursor.fetchall()
        
except:
            return 
False

    def cursorFetchmany
(selfdimension):
        try:
            return 
self.__cursor.fetchmany(dimension)
        
except:
            return 
False

    def cursorFetchone
(self):
        try:
            return 
self.__cursor.fetchone()
        
except:
            return 
False

    def getCursor
(self):
        return 
self.__cursor

    cursor 
property(getCursor)
    
    
def sentenciaSQL(selfinstruccion, *parametro):
        
''' ejecutar sentencia '''
        
try:
            
self.__cursor.execute(instruccionparametro)
        
except:
            return 
False
        
return True 
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
from dato.conexion import conexion
class sentencia(conexion):
    
''' clase del cursor '''

    
def __init__(self):
        
''' Constructor '''
        
conexion.__init__(self)
    
    
def sentencia(selff, *args, **kw_args):
        if 
conexion.conexionAbrir(self) and self.cursorAbrir():
            
error f(*args, **kw_args)
        else:
            
error True
        self
.cursorCerrar()
        
self.conexionCerrar()
        return 
error 
Código PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*
from dato.sentencia import sentencia
class tabla1(sentencia):
    
''' clase para conectar a tabla '''

    
def __init__(self):
        
sentencia.__init__(self)

    
def insert(self, *informacion):
        return 
self.sentencia(self.__insert,*informacion)
    
    
def __insert(self, *informacion):
        for 
i in informacion:
            
sentencia.sentenciaSQL(self,'insert into tabla1 (informacion) VALUES (%s)',i)
        return 
sentencia.conexionCommit(self
no creí ,que pasando la funcion de tabla1 a la clase intermedia pudiese encontrar el camino a tabla1, pero, increiblemente si lo hace.

Etiquetas: herencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:17.