Getters y Setters

Una vez explicado cómo podemos "ocultar" (entre comillas) nuestros atributos y métodos, debemos preguntarnos entonces ¿y cómo debemos acceder y modificar los atributos en caso de que lo necesitemos? Como el objetivo del principio de encapsulamiento es dar acceso solo a través de los métodos pertinentes, lo que suele hacerse crear métodos para acceder al valor de un atributo y métodos para fijar el valor de un atributo (bueno, siempre que veamos oportuno dar este tipo de accesos). Los métodos que permiten acceder al valor de un atributo se denominan "getters" (del verbo inglés "get", obtener) y los que fijan el valor de un atributo se denominan "setters" (del verbo inglés "set", fijar).

Vamos a hacer un ejemplo con nuestra clase Círculo, implementando un método para acceder al radio del mismo y otro para modificarlo. Partimos de la siguiente clase:

class Circulo:
    
    __pi = 3.141592
    
    def __init__(self, radio):
        self.__radio = radio
    
    def __cuadrado(self, n):
        return n ** 2
    
    def area(self):
        return Circulo.__pi * self.__cuadrado(self.__radio)

...en la que solo hemos dado acceso al método area. Creemos entonces un método público que devuelva el valor del radio -y llamémoslo valorRadio-, y otro para cambiar el valor -y llamémoslo fijaRadio-:

class Circulo:
    
    __pi = 3.141592
    
    def __init__(self, radio):
        self.__radio = radio
    
    def __cuadrado(self, n):
        return n ** 2
    
    def area(self):
        return Circulo.__pi * self.__cuadrado(self.__radio)
    
    def valorRadio(self):
        return self.__radio
    
    def fijaRadio(self, nuevoRadio):
        self.__radio = nuevoRadio

Para probarlo vamos a instanciar la clase con un radio de 3 y a calcular el área correspondiente:

c = Circulo(3)
c.area()

28.274328

Accedamos al valor del atributo que representa al radio:

c.valorRadio()

3

Cambiémoslo a 4 y comprobemos su nuevo valor:

c.fijaRadio(4)

c.valorRadio()

4

Y como última comprobación, calculemos el área del círculo con el nuevo radio:

c.area()

50.265472