Clases

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? __privadoestá 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!.

Loading

You must be logged in to take the quiz.