Algunos lenguajes orientados a objetos tienen lo que se llama atributos privados, a los que no se puede acceder desde fuera de los métodos de clase. Esto es importante porque algunos atributos no están destinados a ser cambiados directamente, en cambio, están destinados a ser cambiados como una función de otra cosa, o validados antes de ser cambiados. En Python no tiene los atributos privados , pero puede implementar algo similar usando getters y setters para una variable que comienza con guión bajo: la convención de Python para los métodos y atributos privados.
Por ejemplo. La hipotenusa de un triángulo rectangular está dada por h=sqrt(a*a+b*b)
, por lo que no puede cambiar h
directamente porque la relación debe mantenerse. Además, diga que un nombre debe estar en el formato LASTNAME COMMA FIRSTNAME
, luego debe verificar que este sea el caso antes de asignar self.lastname
.
El captador de propiedad le permite obtener la hipotenusa, pero le impide configurarla. El ajustador de propiedades le permite establecer una propiedad, pero puede realizar comprobaciones antes de establecer realmente la propiedad.
Así:
class Person(object)
def __init__(self):
# The actual attribute is _name
self._name = None
@property
def name(self):
# when I ask for the name, I mean to get _name
return self._name
@name.setter
def name(self, value):
# before setting name I can ensure that it has the right format
if regex_name.match(value):
# assume you have a regular expression to check for the name
self._name = value
else:
raise ValueError('invalid name')
Otro ejemplo:
class Triangle(object):
def __init__(self, a, b):
# here a and b do not need to be private because
# we can change them at will. However, you could
# make them private and ensure that they are floats
# when they are changed
self.a = a
self.b = b
@property
def h(self):
return math.sqrt(a*a+b*b)
# notice there is no h.setter - you cannot set h directly
'40' retorno - me recuerda generador de números aleatorios de xkcd! – katrielalex