Herencia
Contents
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 Persona
está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 AttributeError
al 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.
You must be logged in to take the quiz.