Getters e Setters: Gerenciando Atributos em Python

Getters e Setters: Gerenciando Atributos em Python

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.