manipulando clases

Chema Cortes pych3m4 en gmail.com
Mie Jul 9 11:46:32 CEST 2008


El 2008/7/8  <inf200468 en ucf.edu.cu> escribió:

> sigo con algunas dudas con lo de la herencia, si yo declaro la clase padre y
> luego dentro de una funcion de la clase hija necesito llamar  a un metodo de la
> clase padre , tengo que instanciarla dentro del metodo o puedo llamar al metodo por su
> nombre___

La clase hija "hereda" todos los atributos y métodos del padre. A
efectos prácticos, es como si los métodos fueran de la clase hija.


> otra duda es que si todas las clases tienen que tener declarado un metodo
> __init__ o tienen uno por defecto

No es obligatorio. Si lo hay, heredado o no, se invocará al crear la
instancia. Hay que tener cuidado para invocar "explícitamente" los
métodos __init__ de las clases padre (mírate la documentación sobre el
tema). Puede que esté ahí tu confusión.


> y la otra es que si tengo que tener todas las
> clases en un mismo script

Puedes tener las definiciones donde quieras; la única condición es que
estén definidas antes de ser usadas. Puedes referenciar una clase a
través del nombre del módulo donde se encuentre definida (eg: class
C(mimodulo.miclase) )


> les envio lo que he hecho para si pueden me digan si esta
> bien orientado , porque lo que es funcionar , funciona

Algunos comentarios sobre el código:

> class Conexion:
>
> ��  def __init__(self):
> ������  self.dbname="dbservicios"
> ������  self.user="postgres"
> ������  self.host="127.0.0.1"
> ������  self.password="pepe"

La primera pregunta sería ¿qué produce esta clase? Tu enfoque sigue
siendo demasiado "funcional", usas las instancias de Conexión como si
fueran biblioteca de funciones. Si tu clase crea "conexiones", la
instancia debería ser una conexión, almacenando toda la información
necesaria para ello, nunca se le tendría que pasar ningún parámetro
"conex" como haces en otros métodos. Si quieres, añade un parámetro
que indique si está establecida la conexión o no, o cualquier otra
forma que se te ocurra como abrir y cerrar la conexión en cada
consulta.

Por otro lado, aunque no está mal colocar los parámetros de conexión
dentro del código, la idea que debería primar es crear código
"reutilizable". Harías bien en sacarlos de la definición de clase,
aunque, en realidad, ¿hace falta esta clase para algo?

>
> ��  def conectar(self):
>
> ������  try:
>
> ����������  conn =
> psycopg2.connect("dbname=%s user=%s host=%s password=%s"%��
> (self.dbname,self.user,self.host,self.password))
>
> ������  except:
>
> ����������  print "Error
> de conexion"
>
> ����������  sys.exit()
>
> �����  return conn

Cuando se intercepta un error, es porque se tiene la intención de
recuperar la ejecución; de lo contrario, es mejor dejar pasar la
excepción para que se pueda recuperar desde otro sitio. En este código
estás considerando que todas las excepciones son errores de conexión,
lo que incluye todos los "warnings" que no deberían cortar la
ejecución.


> ����������
> Conexion.__init__(self) #instanciando la clase conexion

La "instanciación" crea una instancia; aquí estás haciendo otra cosa:
estás enviando una instancia de "AnalizadoraAccessApache" para que se
"inicialize" con los atributos de "Conexion". Su lugar debería ser en
un método "__init__" de "AnalizadoraAccessApache":

  def __init__(self):
    Conexion.__init__(self)


Aquí podrías añadir atributos propios de la clase
"AnalizadoraAccessApache". Si no existiera este método "__init__", se
heredaría de "Conexion", por lo que no tienes que hacer nada especial
si no vas a añadir más atributos.



Revisa de nuevo la documentación, que todo ésto viene bastante bien explicado.
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


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