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 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.
![]()
You must be logged in to take the quiz.