Olá, esse é meu primeiro artigo por aqui, espero que gostem. Irei abordar um tema que venho estudando essas útimas semanas.. E por mais que o Python seja uma linguagem fácil e muito amigavél, esse tema me custou algumas horas extras de estudo.
Getters e Setters são um conceito importante em programação orientada a objetos e permitem que os desenvolvedores controlem o acesso aos atributos de uma classe. Em Python, getters e setters são definidos por meio de métodos, que permitem ler e escrever em variáveis de classe.
Um getter é um método que retorna o valor de um atributo de classe, enquanto um setter é um método que modifica o valor do atributo de classe. A principal vantagem de usar getters e setters é que eles ajudam a manter a consistência dos dados e evitam a modificação de valores acidentalmente.
Em Python, a convenção é utilizar um sublinhado antes do nome do atributo para indicar que ele deve ser considerado como privado. Por exemplo, o atributo _nome não deve ser acessado diretamente a partir de um objeto, mas sim por meio de um getter e um setter.
Aqui está um exemplo simples de como implementar um getter e um setter:
class Pessoa:
def __init__(self, nome):
self._nome = nome
def get_nome(self):
return self._nome
def set_nome(self, nome):
self._nome = nome
No exemplo acima, a classe Pessoa tem um atributo _nome que é acessado por meio de um getter e um setter. O método get_nome
retorna o valor do atributo _nome, enquanto o método set_nome
altera o valor do atributo _nome.
É importante notar que, em Python, não é necessário definir explicitamente um getter ou setter. A linguagem possui um recurso chamado "property" que permite criar propriedades que se comportam como getters e setters.
class Pessoa:
def __init__(self, nome):
self._nome = nome
@property
def nome(self):
return self._nome
@nome.setter
def nome(self, nome):
self._nome = nome
Usamos agora a sintaxe de decoradores para criar uma propriedade nome que se comporta como um getter e um setter. O método @property
define a propriedade de leitura, enquanto o método @nome.setter
define a propriedade de escrita.
Em resumo, getters e setters são uma forma de garantir que os dados de uma classe sejam acessados e modificados de forma controlada e consistente. Embora Python ofereça uma sintaxe conveniente para criar propriedades, a definição explícita de métodos getters e setters ainda é amplamente utilizada em projetos Python.
Trabalhando com Herança Getter e Setter x Property
Ao trabalhar com herança em Python, há várias maneiras de gerenciar atributos em subclasses que herdam de uma classe pai. Duas das principais abordagens são o uso de getters e setters e o uso de property.
Usando getters e setters, os atributos são definidos como privados ou protegidos e os métodos getter e setter são usados para acessar e modificar os valores desses atributos. Por exemplo, considerando a classe pai:
class Pessoa:
def __init__(self, nome, idade):
self._nome = nome
self._idade = idade
def get_nome(self):
return self._nome
def set_nome(self, nome):
self._nome = nome
def get_idade(self):
return self._idade
def set_idade(self, idade):
self._idade = idade
Uma subclasse pode herdar esses métodos getter e setter e usá-los para acessar e modificar os atributos privados ou protegidos da classe pai:
class Aluno(Pessoa):
def __init__(self, nome, idade, matricula):
super().__init__(nome, idade)
self._matricula = matricula
def get_matricula(self):
return self._matricula
def set_matricula(self, matricula):
self._matricula = matricula
As property, por outro lado, são um recurso que permite que os métodos getter e setter sejam acessados e usados como atributos. Por exemplo:
class Pessoa:
def __init__(self, nome, idade):
self._nome = nome
self._idade = idade
@property
def nome(self):
return self._nome
@nome.setter
def nome(self, nome):
self._nome = nome
@property
def idade(self):
return self._idade
@idade.setter
def idade(self, idade):
self._idade = idade
Agora, uma subclasse pode simplesmente usar as property como atributos:
class Aluno(Pessoa):
def __init__(self, nome, idade, matricula):
super().__init__(nome, idade)
self._matricula = matricula
@property
def matricula(self):
return self._matricula
@matricula.setter
def matricula(self, matricula):
self._matricula = matricula
O uso de property pode ser mais limpo e elegante do que o uso de getters e setters em algumas situações, mas ambos os métodos têm suas vantagens e desvantagens e devem ser escolhidos com base nas necessidades específicas do projeto.