Em [[Linguagem de programação Python|Python]], getters e setters são usados em [[Classes em Python|classes]] para controlar o acesso e a modificação dos atributos de um objeto. Eles permitem: * **Encapsulamento:** Ocultar a implementação interna de um objeto e expor apenas uma interface controlada. * **Validação:** Garantir que os valores atribuídos aos atributos sejam válidos. * **Abstração:** Permitir que você altere a implementação interna de um atributo sem afetar o código que o utiliza. **Como funcionam:** * **Getter:** Um método que retorna o valor de um atributo. * **Setter:** Um método que define o valor de um atributo. **Exemplo:** ```python class Student: def __init__(self, name, house): self.name = name self._house = house # Convenção: _atributo indica que ele deve ser acessado via getter/setter @property # Cria um getter para o atributo 'house' def house(self): return self._house @house.setter # Cria um setter para o atributo 'house' def house(self, house): if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid House") self._house = house # Uso: student = Student("Harry", "Gryffindor") print(student.house) # Output: Gryffindor student.house = "Slytherin" print(student.house) # Output: Slytherin # student.house = "Invalid House" # Isso levantaria um ValueError ``` **Explicação:** * `_house`: Usamos `_house` (com um underscore no início) para indicar que este atributo deve ser acessado através dos getters e setters. É uma convenção em Python. * `@property`: O decorador `@property` transforma o método `house(self)` em um getter. Agora podemos acessar o valor da casa usando `student.house` (como se fosse um atributo normal). * `@house.setter`: O decorador `@house.setter` transforma o método `house(self, house)` em um setter. Agora podemos definir o valor da casa usando `student.house = "Slytherin"`. * **Validação:** No setter, verificamos se a casa é válida antes de atribuir o valor. Se a casa for inválida, levantamos uma exceção `ValueError`. **Vantagens de usar getters e setters:** * **Controle:** Você tem controle total sobre como os atributos são acessados e modificados. * **Flexibilidade:** Você pode adicionar lógica (como validação) aos getters e setters sem alterar o código que usa a classe. * **Manutenção:** Facilita a manutenção e a refatoração do código. **Referência:** * [Página de Classes Python da W3schools](https://www.w3schools.com/python/python_classes.asp)