Sobre propiedades privadas

Francisco Palm fpalm en ula.ve
Sab Sep 9 13:23:43 CEST 2006


On 9/7/06, Ernesto Freyre G. <ernesto en consumimport.mincex.cu> wrote:
>
> cuando me referia al "mangling" no lo veo como una opcion para hacer
> privada ni propiedades ni metodos.
>
> basicamente esto es posible:
>
> class A:
>         def __init__(self, valor):
>                 self.__valor = valor
>
>
>
> por lo tanto...
>
> a = A(3)
> a._A__valor = 4
>
> es posible, ya que por definicion todas las propiedades y metodos de
> clase son publicos y la declaracion de variables o metodos con '__' como
> prefijo lo unico que garantiza es una conversion de nomenclatura
> (mangling) para semi-ocultar el valor o propiedad. Nada que no se puede
> explorar usando un poco de "reflection"
>
> Por lo que me pregunto, existe alguna manera efectiva de declarar
> propiedades o metodos privados de clase


Pues esta manera es muy efectiva, de hecho, superefectiva.

Si el usuario escribe a.valor le va a devolver error, y si tiene que
utilizar _A__valor entonces ya está recibiendo la advertencia pero nada le
impide meterse en los detalles de la aplicación si así lo requiere. Tanto en
Java como en Delphi como en C++ cuantas veces uno estuvo luchando contra una
librería que por diseño de un programador que no pensó en otras formas de
utilización cerraba un campo o un método crítico. Si uno tenía el código
fuente ¿qué se hacía?, r: declarar el campo o el método público.

Por otra parte: puedes crear una nueva clase y sobrecargas el operador
asignación con el método __setitem__ para que no haga nada, tomado de
http://effbot.org/librarybook/userlist.htm

import UserList

class AutoList(UserList.UserList):

    def __setitem__(self, i, item):
        if i == len(self.data):
            self.data.append(item)
        else:
            self.data[i] = item

list = AutoList()

for i in range(10):
    list[i] = i

print list


Saludos

F. Palm


-- 
del Delirio al Limbo....




Más información sobre la lista de distribución Python-es