Clases

Herencia

Ahora vamos a hablar de la Herencia. Una de las piedras angulares de la programación basada en clases.

Como ya habíamos dicho, las clases nos permiten evitar repetir código al crear código base y despues extenderlo agregando solo los métodos o propiedades que nos hagan falta:

 

class Persona():
    def __init__(self, nombre, apellidos, direccion, edad):
        self.nombre = nombre
        self.apellidos = apellidos
        self.direccion = direccion 
        self.edad = edad

    def __str__(self):
        return "%s, %s, %s" % (self.nombre, self.apellidos, self.direccion)

    def __unicode__(self):
        return u"%s, %s, %s" % (self.nombre, self.apellidos, self.direccion)

    def __add__(self, other):
        return "%s %s vive en '%s' y %s %s vive en '%s', entre los dos suman %d de edad"%(
                self.nombre, self.apellidos, self.direccion, other. nombre, other.apellidos,
                other.direccion, self.edad + other.edad)

    def __privado(self):
        print "Bingo.. metodo privado"

    def get_nombre(self):
        return self.nombre

    def get_apellidos(self):
        return self.apellidos

    def get_direccion(self):
        return self.direccion

class Perfil(Persona):
    def __init__(self, nombre, apellidos, direccion, edad, usuario, password):
        Persona.__init__(self, nombre, apellidos, direccion, edad)
        self.usuario = usuario
        self.password = password


user = Perfil("Marco", "Islas", "Por aqui", 34, "markuzmx", "1234567890")
print dir(user)
['_Persona__privado', '__add__', '__doc__', '__init__', '__module__', '__str__', '__unicode__', 'apellidos', 'direccion', 'edad', 'get_apellidos', 'get_direccion', 'get_nombre', 'nombre', 'password', 'usuario']

Como podemos ver en el ejemplo, los métodos y propiedades de Personaestán disponibles para Perfil  póqueres este hereda dichos métodos y propiedades. Para poder especificar de que clases se heredaran métodos y propiedades se realiza lo siguiente:

class ClaseHija(ClasePadre1, ClasePadre2, ClasePadre3):

Como podemos ver, se define la clase hija (class ClaseHija ), luego entre paréntesis se especifican las clases padre, pueden haber N numero de clases padre.. (ClasePadre1,  ClasePadre2, ClasePadre3) .

La forma de resolver los metodo y propiedades van de izquierda a derecha, es decir, primero se buscan en la clase hija, luego en ClasePadre1, si no se encuentran entonces a ClasePadre2 y así subsecuentemente, si no se encuentra el método o propiedad entonces se lanzara la excepción AttributeError.

Metodos privados en hererencia

Se supone que no puedes acceder a los metidos privados de una clase padre, pero como ya hemos mencionado antes, en Python un método o propiedad privada no son tan exclusivos, entonces, si hay forma de acceder a ellos.

Puedes otra ves de la forma _ + Nombre de clase + Nombre de metodo,  pero si puedes acceder a los métodos especiales como __init__, __add__  etc..

Por ejemplo, definamos la clase Persona y agreguemos una metodo llamado `__dias_desde_nacimiento`

class Persona:
    def __dias_desde_nacimiento(self):
        return 10

Ahora crearemos una instancia de esta clase y trataremos de acceder por medio del mecanismo normal. (instancia.__dias_desde_nacimeinto()`):

>>> p = Persona()
>>> p.__dias_desde_nacimiento()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Persona instance has no attribute '__dias_desde_nacimiento'

Como podemos ver,  nos manda un AttributeErroral tratar de acceder a dicho método, pero veamos que nos dice la función dir:

>>> dir(p)
['_Persona__dias_desde_nacimiento', '__doc__', '__module__']

Podemos ver _Persona__dias_desde_nacimiento. Será entonces que podemos acceder a este método?.

>>> p._Persona__dias_desde_nacimiento()
>>> 10

Entonces, si heredamos de la clase “Persona” podríamos acceder a este método de la forma self._Persona__dias_desde_nacimiento().


Si te gusta el tutorial, por favor mándame un mensaje, mi twitter: @markuzmx , tal vez te gustó tanto que prefieras hacer una donación via paypal la cantidad tu la pones ? Gracias por apoyarme.

Loading

You must be logged in to take the quiz.