Problemas con Herencia

Patricio Olivares polivare en lilyphilia.net
Sab Feb 24 22:34:30 CET 2007


Rayner Rodríguez Pimentel wrote:
> Hola a Todos.
> 
> Tengo un problema al tratar de heredar de una clase base, cuando pongo:
> 
> import psycopg2
> 
> class ConexionBD:
>     def _init_(self):
>         try:
>             self.conn=psycopg2.connect("dbname='db_prueba' user='postgres'
> host='localhost' password='postgres'")
>         except:
>             print "No puede conectarse a la BD"
> 
>     def AbrirCon():
>         cur = conn.cursor()
>         return cur
> 
>     def CerrarCon():
>         conn.close()
> 
> class Indisciplina(ConexionBD):
>     def _init_(self):
>         self.nombre='nombrep'
>         self.area='areap'
>         self.cargo='cargop'
>         self.fechaI='fechaIndisc'
>         self.fechaR='fechaRep'
>         self.descripcion='descripIndisc'
>         self.fInvolucrada='facInv'
>         self.lugar='lugarIndisc'
> 
>     def getareaReporta(self):
>         return self.area
> 
>     def setareaReporta(newVal):
>         area=newVal
> ...
> 
> Me sale un error de este tipo:
> 
> *NameError: name 'OperacionesBD' is not defined*
> 
> No sé que será eso pero parece que no encuentra esa clase.


El error significa que estás usando 'OperacionesBD' en alguna
parte pero el nombre no es visible en ese lugar. El problema es
que en el código que pegaste no aparece ningún uso de ese nombre
asi que falta información. En la traza del error debería aparecer
el número de la línea en que se hace la llamada.

Otra cosa. En la clase Indisciplina, supongo que quieres que la
conexión a la BD se inicie cuando creas un objeto, sino no le veo
mucho sentido a heredar de ConexionBD...

ind = Indisciplina()  # aqui se deberia conectar a la BD
# ...
ind.getareaReporta()
#...
ind.grabar() # o algo así

por lo que veo no se está llamando al método __init__ de
ConexionBD. Para eso, deberías hacer un par de cambios:

- En la declaración de ConexionBD heredar de object:
class ConexionBD(object):

- En el constructor de Indisciplina usar super():
class Indisciplina(ConexionBD):
    def __init__(self):
        super(Indisciplina, self).__init__()
        # ... el resto del constructor de Indisciplina

Los métodos deberían declararse siempre usando 'self' como
primer argumento (a menos que sepas lo que estás haciendo). En
setareaReporta te faltó, así como en los de abrir y cerrar en
ConexionBD.

Cuando te quieras referir a un atributo del objeto dentro de la
misma clase, deberías usar self.elatributo . En eso vas a tener
problemas en ConexionBD con el atributo 'conn' y en
setareaReporta.

La última, a menos que estés siguiendo alguna convención especial,
no necesitas escribir getters y setters para cada atributo en
Indisciplina. Te sale más limpio acceder directamente a los
atributos:

ind = Indisciplina()
ind.nombre = 'nuevonombre'
print 'nuevo cargo:', ind.cargo




Más información sobre la lista de distribución Python-es