Ver Mensaje Individual
  #12 (permalink)  
Antiguo 18/10/2009, 13:04
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

Cita:
Iniciado por navarone86
lo que pretendo es crear una clase en la que para acceder a sus atributos (ya sea asignar u obtener), solo pueda hacerse mediante los getters y setters. pero parece ser que no se puede, no ?
Si se puede hacer, solo que no le puedes poner __ al principio del nombre del atributo.

Cita:
Iniciado por navarone86
no acabo de entender para que sirve la sentencia "property", porque en el ejemplo de la guía, después de definir los getters y setters, y la sentencia property correspondiente, siguen accediendo a los atributos mediante clase.atributo
Primero un poco de variables privadas y publicas.
Código python:
Ver original
  1. class Prueba:
  2.     def __init__(self):
  3.         self.x = 0 #Publica
  4.         self.__x = 0 #Privada
  5. obj = Prueba()
  6. obj.x #Imprimira 0
  7. obj.__x #Error, es una variable privada

Hora que ya sabemos que self.x self.__x son variables diferentes. Pasaremos a lo de property
Lo único que hace property es sobrecargar el operador = (En el caso de los setter)
Y enlazar el atributo con el método dado (En el caso de los getter)

Solo para seguir con tu ejemplo:
Código python:
Ver original
  1. class Persona(object):
  2.     """Clase Persona"""
  3.        
  4.     def __init__(self, nombre="", apellido="", dni=""):
  5.         """
  6.            Este no es el contructor, solo es el inicializador
  7.            la funcion __new__ es el contructor. Pero solo se
  8.            rara vez se define __new__ por el programador.
  9.        """
  10.         self.__nombre = nombre
  11.         self.__apellido = apellido
  12.         self.__dni = dni
  13.  
  14.     def getNombre(self):
  15.         return self.__nombre
  16.        
  17.     def setNombre(self, n):
  18.         self.__nombre = n
  19.    
  20.     def getApellido(self):
  21.         return self.__apellido
  22.        
  23.     def setApellido(self, a):
  24.         self.__apellido = a
  25.        
  26.     def getDni(self):
  27.         #return self.__nombre
  28.         #Creo que deverias retornar self.__dni
  29.         return self.__dni
  30.        
  31.     def setDni(self, d):
  32.         self.__dni = d
  33.        
  34.     #__nombre = property(getNombre, setNombre)
  35.     #__apellido = property(getApellido, setApellido)
  36.     #__dni = property(getDni, setDni)
  37.     # No pueden ir con __ al principio
  38.     nombre = property(getNombre, setNombre)
  39.     apellido = property(getApellido, setApellido)
  40.     dni = property(getDni, setDni)
  41.  
  42. persona = Persona()
  43.  
  44. persona.nombre = "Maria"
  45. persona.apellido = "La del barrio"
  46. persona.dni = "No tengo idea que vaya aqui"
  47.  
  48. print persona.nombre
  49. print persona.apellido
  50. print persona.dni

Para lo de la sintaxis lee este post