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)