Anuncios

Bienvenidos sean a este post, hasta ahora hablamos de unas clases implicitas que trabajamos sin saberlo.

Anuncios

Hasta ahora hemos visto que podemos definir una clase de las siguientes maneras:

class NombreClase():
    pass

class NombreClase:
    pass
Anuncios

Esto define una clase nueva y como dijimos los parentesis pueden ser utilizados o no para el caso de la definicion de una nueva clase pero cuando creamos clases herederas lo hacemos de la siguiente forma:

class NombreClase(NombreClasePadre):
    pass
Anuncios

En este caso si debemos usar los parentesis porque si o si debemos enviar una clase base para que actue de padre de nuestra clase hija, pero en los primeros casos sin saberlo tambien se utiliza una clase base pero el encargado sera python que establecer como clase base a la clase especial object para esta de forma implicita y no explicita, por lo tanto podemos decir que todos las clases derivan de un objeto.

Anuncios

Con esto podemos concluir que todas las clases tienen una clase padre porque todas seran hijas de la clase especial object, esta clase tiene la particularidad de poseer todos los metodos que son comunes para todas las clases de python, y esta no permite establecer ninguna propiedad en ella, pasemos a un ejemplo donde podamos ver como acceder a una clase base:

>>> class Libro:
...     def __init__(self, titulo, publicista, paginas):
...             self.titulo = titulo
...             self.publicista = publicista
...             self.paginas = paginas
... 
>>>
Anuncios

Esta clase sera la base para nuestras hijas, en la misma tenemos una funcion __init__ para recibir unos valores e iniciar unas nuevas propiedades con los mismos, pasemos a crear una clase heredera:

>>> class Ebook(Libro):
...     def __init__(self, titulo, publicista, paginas, formato):
...             self.titulo = titulo
...             self.publicista = publicista
...             self.paginas = paginas
...             self.formato = formato
... 
>>>
Anuncios
Anuncios

En este caso tenemos una clase que no solamente es heredera de la clase Libro y dentro no solo iniciaremos los mismos tres valores de la clase base sino que agregaremos uno nuevo que es el formato pero si observan esto tiene un inconveniente y es que estamos repitiendo informacion innecesaria en la clase heredera porque ya existen en la base pero como podemos hacer para iniciarla a traves de __init__? Bueno, probemos modificando la clase base de la siguiente forma:

>>> class Ebook(Libro):
...     def __init__(self, titulo, publicista, paginas, formato):
...             Libro.__init__(self, titulo, publicista, paginas)
...             self.formato = formato
... 
>>>
Anuncios

Esta es una mejor forma porque no solamente quitamos la duplicacion de elementos sino que ademas pudimos comprimirlo un poco mas, si bien este es completamente funcional todavia lo podemos mejorar un poco mas, veamos la nueva modificacion:

>>> class Ebook(Libro):
...     def __init__(self, titulo, publicista, paginas, formato):
...             super().__init__(titulo, publicista, paginas)
...             self.formato = formato
... 
>>>
Anuncios
Anuncios

En este caso usamos la funcion super, esta es una opcion muy interesante porque trabaja igual a la de Java ya que nos devuelve un objeto proxy que delega las llamadas de metodos a una clase padre o hermana, es decir que equivale a utilizar el nombre de la clase padre pero cual es la ventaja de usar esto en lugar de la otra forma? La mas importante de todas, como nos devuelve un objeto de la clase padre trabajaremos sobre un acceso y no directamente con la clase, por ejemplo si nosotros decidimos cambiar el nombre de la clase Libro a Book porque nos resulta mas practico, en el ejemplo anterior ese codigo no funciona porque busca a la clase Libro y no la encontrara por lo tanto debemos modificarlo en todas sus hijas pero si usamos super esta modificacion se hara automaticamente porque siempre buscara al padre de ella, facilitando nuestra tarea pasemos a probar creando un nuevo objeto de Ebook y mostrando la informacion:

>>> ebook = Ebook(
...     'Host scripting con VBscript', 'Amazon', 400, 'Kindle')
>>> print(ebook.titulo)
Host scripting con VBscript
>>> print(ebook.publicista, ebook.paginas)
Amazon 400
>>> print(ebook.formato)
Kindle
>>>
Anuncios

Primero crearemos el nuevo objeto, luego imprimimos cada uno de los campos que iniciamos y vemos como nos lo devuelven correctamente, recuerden que cuando debemos iniciar valores de una clase base o acceder a la clase base para ingresar valores se debe usar a la funcion super.

Anuncios

En resumen, hoy hemos visto que es una clase base, como existe una clase base para todas las clases, como esta puede estar implicitamente en nuestra clase sin necesidad de definirla, despues hemos visto las distintas forma de iniciar valores de una clase base para finalmente ver la funcion que nos facilitara todo nuestros trabajos para ello como es super, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50