Python Avanzado
Python Avanzado
Ernesto Revilla
Software Integrado para el Control de Empresas, s.l.
Un ejemplo prctico
Para este ejemplo es necesario tener la base de datos sqlite (www.sqlite.org), como tambin el binding para python (pysqlite.sourceforge.net). Conexin a una bd sqlite: import sqlite con=sqlite.connect('archivo.sqlite') cur=con.cursor() def crearTabla(): cur.execute("create table personas (num integer, "\ "nombre text, "apellidos text, edad integer;") def insertarDatosEjemplo(): personas=[ [1, 'Erny', 'Revilla'], [2, 'Lorenzo', 'Gil'], [3, 'Dani', 'Molina']] for persona in personas: cur.execute("insert into personas (num, nombre, "\ "apellidos) values (%s, '%s', '%s');" % tuple(persona)) Vea los archivo db1.py, db2.py y db3.py que muestran como puede crearse una pequea capa de persistencia para objetos.
GCubo: Grupo de usuarios de GNU/Linux de Granada
__init__ representa el mtodo de inicializacin de instancia, no es el constructor (como en c++) sino el inicializador. __init__ es llamado despus de haberse reservado la memoria y realizado una minima inicializacin del objeto. al realizar herencia mltiple es necesario definir __init__ para indicar el orden de las llamadas de __init__ de las superclases
class A(object): def __init__(self): print "__init__ de A" class B(object): def __init__(self): print "__init__ de B" class C(A,B): pass # esto est mal!!! c=C() class C(A,B): def __init__(self): A.__init__(self) B.__init__(self)
Vea EjemploInit.py
GCubo: Grupo de usuarios de GNU/Linux de Granada
__new__, el constructor
__new__ siempre es un mtodo de clase __new__ aparece en la versin 2.2 de python con __new__ se puede devolver tambin instancias de otros tipos. Ejemplos: class A(object): def __init__(self, *args, **kwargs): print "creando objeto de tipo A con "\ "argumentos pos. %s y argumentos nombrados %s" % (args, kwargs)
# devolver otros tipos de objetos class B(object): def __new__(cls, *args, **kwargs): return A(*args, **kwargs) x=B(1,2, pepe='no')
Vea EjemploNew.py
__new__: singleton
# singleton: class Singleton(object): _instance=None def __new__(cls, *args, **kwargs): if not cls._instance: print "Creando Singleton" cls._instance=object.__new__(cls, *args, **kwargs) return cls._instance def __init__(self, *args, **kwargs): print "Inicializando Singleton" s=Singleton() s=Singleton()
Metaclases
Al terminar la lectura de la definicin de una clase, Python crea sta usando una metaclase de forma Metaclase(nombre, superclases, diccionario) Nombre es el nombre de la clase, Superclases es una tupla diccionario contiene las funciones e identificadores definidos dentro de la clase Actualmente (>=2.2) usa dos metaclases, una para las clases antiguas (types.ClassType) y otra para las nuevas (type) En la metaclase podemos definir nuevos atributos o funciones para la clase class Metaclase(type): def __init__(self, name, bases, dic): type.__init__(self, name, bases, dic) print "\nDefiniendo clase %s:" % name print "Bases: %s" % (bases or None) print "Dict: %s" % dic class A(object): __metaclass__=Metaclase _attributes=["at1","at2","at3"] y=5 def __init__(self): self.x=10 GCubo: Grupo de usuarios de GNU/Linux de Granada
Metaclases 2
Vea Metaclases.py para ejemplo anterior.
El siguiente ejemplo crea nuevos mtodos en una clase (getters y setters) para los atributos especificados. class Metaclase(type): def __init__(self, name, bases, dic): type.__init__(self, name, bases, dic) if "_attributes" in dic: for attr in dic['_attributes']: f=lambda s,a=attr: getattr(s,a) setattr(self, 'get'+attr, f) f=lambda s, value, a=attr: setattr(s,a,value) setattr(self, 'set'+attr, f)
Vea Metaclases2.py