Métodos y propiedades reservadas
Contents
En otros lenguajes tenemos algo llamado métodos y propiedades publicas y reservadas, incluso, hay una sintaxis bastante especifica para esto, como anteponer la palabra public
o private
antes del nombre del metodo. A mi gusto es engorroso.
En Python, sinceramente, no existen los métodos/propiedades privados como tal, pero son una aproximación que bien cumple con el propósito, el cual es, que las clases hijas no sobreescriban a las padres.
Un método o propiedad privada en Python se define usando doble guión bajo al empezar el nombre, algo asi:
def __init__(self, ):
Oye, pero ese es el método inicializador!. Cierto, el método inicializador es un método privado, y lo mismo que todos esos métodos especiales que vimos anteriormente. Pero podemos crear los nuestros. Solo necesitamos anteponer doble guion bajo en el nombre.
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 usuario = Persona("Marco", "Islas", "Por aqui", 34) print dir(usuario) usuario.__privado() ['_Persona__privado', '__add__', '__doc__', '__init__', '__module__', '__str__', '__unicode__', 'apellidos', 'direccion', 'edad', 'get_apellidos', 'get_direccion', 'get_nombre', 'nombre'] Traceback (most recent call last): File "", line 35, in AttributeError: Persona instance has no attribute '__privado'
¿Qué ha pasado aqui? __privado
está definida, pero dir()
no muestra __privado
muestra _Persona__privado
.
Por eso se dice que los métodos privados en Python no son privados, nada fue cambiado de __privado
a una combinación de _
+ Nombre de clase
+ Nombre de metodo
, pero ahí está.
Entonces podría acceder a través de _Persona__privado
?. Veamos:
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 ['_Persona__privado', '__add__', '__doc__', '__init__', '__module__', '__str__', '__unicode__', 'apellidos', 'direccion', 'edad', 'get_apellidos', 'get_direccion', 'get_nombre', 'nombre'] Bingo.. metodo privado
Lo mismo sucede con las propiedades!.
You must be logged in to take the quiz.