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 originalclass Prueba:
def __init__(self):
self.x = 0 #Publica
self.__x = 0 #Privada
obj = Prueba()
obj.x #Imprimira 0
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 originalclass Persona(object):
"""Clase Persona"""
def __init__(self, nombre="", apellido="", dni=""):
"""
Este no es el contructor, solo es el inicializador
la funcion __new__ es el contructor. Pero solo se
rara vez se define __new__ por el programador.
"""
self.__nombre = nombre
self.__apellido = apellido
self.__dni = dni
def getNombre(self):
return self.__nombre
def setNombre(self, n):
self.__nombre = n
def getApellido(self):
return self.__apellido
def setApellido(self, a):
self.__apellido = a
def getDni(self):
#return self.__nombre
#Creo que deverias retornar self.__dni
return self.__dni
def setDni(self, d):
self.__dni = d
#__nombre = property(getNombre, setNombre)
#__apellido = property(getApellido, setApellido)
#__dni = property(getDni, setDni)
# No pueden ir con __ al principio
nombre = property(getNombre, setNombre)
apellido = property(getApellido, setApellido)
dni = property(getDni, setDni)
persona = Persona()
persona.nombre = "Maria"
persona.apellido = "La del barrio"
persona.dni = "No tengo idea que vaya aqui"
print persona.nombre
print persona.apellido
print persona.dni
Para lo de la sintaxis lee
este post