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