ambar-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minë-dev] Pues no me aclaro con la privacidad: Socorrrooooooo


From: Andres Moya
Subject: Re: [Minë-dev] Pues no me aclaro con la privacidad: Socorrrooooooo
Date: 21 Mar 2003 09:00:34 +0100

El jue, 20-03-2003 a las 19:51, Gabriel Pulido de Torres escribió:
> Hola chicos, a ver creo que tengo un par de dudas existenciales sobre
> el pythony la privacidad de los datos.
> si ponemos dos guiones bajos delante de un atributo o método ese
> atributo o método es público verdad?

Nope, es justo al revés: es privado.



> Vale, entonces, si yo tengo una clase que hereda los atributos y/o
> métodos de otra clase para llamar a los atributos (métodos) de su
> madre simplemente hay que poner self.__nombreatributo no? como si
> fuese ella misma la que tuviese esos atributos.
> A ver ejemplo
> Tengo la clase sala con un método que es 
> def __parsear_sala(self, elem_sala):
>  
> si tengo una clase llamémosla Sala_editable(Sala)  para llamar al
> método anterior dentro de la clase sala_aditable sería:
> self.__parsear_sala(loquesea) ¿verdad?

Nooo, en principio no podrías acceder a ese método. Como dice Aranarth,
en realidad podrías hacerlo mediante el "truco" de escribir:

  self._sala__parsear_sala(...)

Esto (en mi opinión) es bastante feo y conviene siempre buscar un método
alternativo. Pero en ocasiones no hay más remedio, dado que en Python no
existe la "exportación selectiva" como en Eiffel, ni tampoco métodos
privados o clases "friend" como en C++. Sinceramente, esta es una de las
pocas cosas que no me gustan de Python :"-(



> Si no es así que alguien me cuente como ·$·%"· funciona la herencia en
> python que me voy a volver loco...

Pos eso, hombre, no te agobies ... ;)

Funciona de la manera normal, con la salvedad de que los miembros que
comienzan por __miembro, el compilador los traduce por
_NombreClase__miembro. Y NombreClase es el nombre de la clase donde lo
estás *llamando*. Por eso, si lo llamas desde una clase distinta de la
que está definido, no lo encuentra (que es lo que se pretende :-P).

 
> Horrorrrrrrrr, resulta que si quito los dos guiones bajos del método
> al principio, puedo acceder sin problemas desde la clase hija.... Joer
> ya si que no se por donde van los tiros. Si con guiones bajos entonces
> es privada, ¿pq los métodos de acceso a los atributos de una sala
> (denotados como __leer_aura por ejemplo) son privados?

Si, los métodos de acceso son privados, pero es que no accedes a ellos
directamente, sino a través de la "property". Por ejemplo:

  class Personaje(object):

    def __leer_vida(self): ...
    def __poner_vida(self, vida): ...

    vida = property(__leer_vida, __poner_vida) 


Aquí estás definiendo dos métodos privados, y un atributo público (por
que no lleva __), que se llama "vida" y es de tipo "property". Esto
quiere decir que para leer y escribir, en vez de ir directamente a una
posición de memoria, llama a dos funciones. Pero esta llamada se hace ya
desde "dentro" de la clase, por lo que es perfectamente válido que las
funciones sean privadas. De hecho, es mejor que sean privadas y así los
usuarios de la clase no tienen por qué llamarlas directamente.

Este sistema tampoco me convence mucho en cuanto a elegancia y
eficiencia, pero es lo que hay.

Recordad que las "properties" sólo funcionan a partir de Python 2.2, y
sólo en clases que derivan directa o indirectamente de "object".

Una curiosidad: las "properties" también se pueden redefinir en clases
base. Por ejemplo:

  class Objeto(object):

    def __init__(self, nombre):
      self.__nombre = nombre

    def __leer_nombre(self):
      return self.__nombre

    nombre = property(__leer_nombre)

  
  class ObjetoEditable(Objeto):

    def __init__(self, nombre):
      Objeto.__init__(self, nombre)

    def __poner_nombre(self, nombre):
      self._Objeto__nombre = nombre

    nombre = property(Objeto._Objeto__leer_nombre, __poner_nombre)



> Como necesito poder acceder a los métodos __parsear_loquesea desde la
> clase hija, creo que me voy a cargar los dos guiones bajo de esos
> métodos (a no ser que alguien me diga algo mejor...)
> Seguro que todo esto tiene una explicación racional (y yo debo de
> estar tan dormido que no lo veo...)

Noo, no lo hagas!!! Ya ves que tiene solución...

Por cierto. Yo escribí hace tiempo un pequeño texto con algo de teoría
respecto de estas cosas, y creo recordar que estaba en la carpeta
"documentos". Se ve que se ha borrado en alguna de las reorganizaciones.
Aranarth, ¿habría forma de recuperarlo?

Y otra -> Gabi, en cuanto termines de reorganizar la lectura de XML de
la clase Objeto, pásamela, porfa. Que estoy ya escribiendo la parte de
sucesos, y voy a empezar a probarla leyendo sucesos dentro de los usos
de objetos.
 
> Un saludo
> Gabi

Igualmente.
Andrés


P.D. tengo un fichero que hice con diversas pruebas sobre manejo de
atributos en Python. Si alguien entiende todo lo que ocurre en este
programa, tiene premio :D

-- 
Andres Moya <address@hidden>

"No a la guerra - Otro mundo es posible"
"No queremos a Bush - Tampoco a Sadam"

Attachment: pruebas.py
Description: application/python


reply via email to

[Prev in Thread] Current Thread [Next in Thread]