-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El 04/05/13 20:47, Fernando Villarroel escribió:

> Ya que se toco el tema de las "meta clases" quisiera aprovechar si 
> alguien lo puede ejemplificar o explicar su concepto.

Sería mucho para contar, pero intentaré resumir:

En python, todo son objetos y como tales son instancias que heredan de
la superclase 'object'. Así pues, si siguiéramos la jerarquía de
clases, toda clase es hija de 'object':

  class MiClase(object):
    pass

  obj = MiClase()
  isintance(obj, object)  #->True
  issubclass(MiClase, object) #->True

Por otro lado, una clase es también un objeto, y como tal es instancia
de la superclase 'type':

  isinstance(MiClase, type)  #->True

Esta dualidad entre objeto y tipo nos lleva a una definición cíclica
del sistema de clases de python:

  issubclass(object, object) #->True
  issubclass(type, object) #->True
  issubclass(object, type) #->False***
  issubclass(type, type) #->True

  isinstance(object, object) #->True
  isinstance(type, object) #->True
  isinstance(object, type) #->True
  isinstance(type, type) #->True


Lo importante a tener en cuenta es que

- - Toda clase hereda de 'object'
- - Toda clase es instancia de 'type'

Con ésto en mente podemos definir "metaclase" como "una clase que
hereda de 'type' cuyas instancias son clases".

En la práctica: cuando en tu código defines una clase, sólo por hacer
éso, antes de nada más, estás creando un objeto que es instancia de
type. Tenemos la posibilidad de que esta clase se cree a partir de una
metaclase, con la que podríamos controlar la creación de clases de un
mismo tipo:

class MiClase(SuperClase, metaclass=MetaClase):
  ...

Así sería en python3, en python2 se debe usar el atributo __metaclass__

Ahora imagina lo que se puede hacer. Al definir una clase, se invoca
al constructor de la metaclase (__new__) donde puedes hacer de todo,
desde añadir nuevos métodos hasta retornar como instancia otra clase
distinta de la que se esperaba. Realmente, se pueden hacer verdaderas
aberraciones.

 class MetaClase(type):
   def __new__(cls, name, bases, dct):
     dct["meth"] = meth2
     return type("OtraClase", bases, dct)

Con esta metaclase, la definición anterior de 'MiClase' cambiaría a
llamarse "OtraClase" y su método "meth" se cambiaría por "meth2".
Realmente, muy difícil de seguir y mantener.

Por otra parte, las metaclases, al igual que los tipos, no tienen
herencia múltiple. Se suele decir que las metaclases evitan la
necesidad de usar la herencia múltiple para compartir interfaces entre
clases. Por si acaso, yo aconsejaría no mezclar metaclases y herencia
múltiple en el mismo código.

A partir de aquí, sólo queda buscar algunos ejemplos.

Como sitio donde se explica bastante mejor estos conceptos, recomiendo
cafepy:

http://cafepy.com/article/python_types_and_objects/



- -- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJRhlV7AAoJEFdWyBWwhL4F+CQH/0iTxnH5WUBn7He++anEJa4h
iF1YbjOFnP2A5jYze7vq6lqj1MIAd13KxZdr8bm63uw7+oXtxV+1slnu/s6N4uzC
fUXhuZ6Wt/erM0id7TRntMc2Cu/IDzV8ddn59oYlFaw/TLjv3Sc6edQqKWBB8Lq9
g/zx4oRxfe0XeUpwbjNaaBydfvjNGKuw2siM9joSQoQHEHF27A818mxYXC4ZCo//
ySAOG8yh3claK04k1CGeZvC3UGVAwNyGOcZlvO0OX8pMbtzW1dswWVeQC9ERt14c
VpmpnVtXOAC119ickJBhqrpYXAq00Fbjc8VgdZkwBM713r3BCslvJuVYzuXW418=
=C0fI
-----END PGP SIGNATURE-----
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a