Propriedades em Python

0 – Python
5 – Orientada a Objetos (POO)
5.1 – Classes e objetos
5.2 – Herança (simples e múltipla)
5.3 – Polimorfismo
5.4 – Encapsulamento (público, _protegido, __privado)
5.5 – Métodos mágicos (__init__, __call__, __add__, etc.)
5.6 – Propriedades (@property, setter, deleter)
5.7 – Classes abstratas (ABC, abstractmethod)
5.8 – Metaclasses (type, __new__)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Propriedades permitem controlar o acesso a atributos de classe. Elas transformam métodos em atributos virtuais com lógica personalizada. Primeiramente, @property cria um getter para o atributo. Por exemplo, @property seguido de def nome(self). Além disso, @nome.setter define um setter para validação. O decorador @nome.deleter controla a deleção do atributo. A voz passiva é usada aqui: “os valores são validados antes de serem armazenados”. Quando utilizar propriedades? Em atributos que precisam de validação. Também para criar atributos calculados ou somente leitura. Propriedades mantêm a sintaxe simples de atributos públicos. Porém, elas adicionam lógica de negócio por trás dos panos. Vamos explorar cada tipo com exemplos práticos. Três subtítulos guiarão você pelas propriedades em Python. Ao final, você projetará classes mais seguras e expressivas.

Getter: lendo valores com @property

O decorador @property transforma um método em getter. Você acessa o valor como um atributo normal, sem parênteses. Quando usar getter? Para atributos calculados dinamicamente. Também para expor dados internos de forma controlada. A voz passiva é aplicada: “o valor é calculado a cada acesso”. Exemplo de getter:

Getters são ideais para atributos derivados ou somente leitura. Eles mantêm a interface limpa e consistente.

Setter: validando valores com @nome.setter

O setter permite validar dados antes de armazená-los. Use @nome.setter no método que recebe o novo valor. Quando usar setter? Para atributos que exigem validação. Por exemplo, idade negativa ou saldo insuficiente. A voz passiva é aplicada: “a validação é aplicada automaticamente”. Exemplo de setter:

Setters protegem a integridade dos seus dados. Eles centralizam a lógica de validação em um único lugar.

Deleter: controlando remoção de atributos

O deleter define o comportamento de del objeto.atributo. Use @nome.deleter para impedir ou logar deleções. Quando usar deleter? Em atributos que não devem ser removidos. Também para realizar limpeza antes da remoção. A voz passiva é aplicada: “a deleção é interceptada pelo deleter”. Exemplo de deleter:

Deleters oferecem controle fino sobre a remoção de atributos. A fórmula de encapsulamento com propriedades: \(E = \text{getter} + \text{setter} + \text{deleter}\) Use getter para acesso controlado ou valores calculados. Use setter para validação e transformação de dados. Use deleter para limpeza ou prevenção de deleções. Propriedades mantêm sua API limpa e seu código seguro.

Métodos Mágicos em Python

python
0 – Python
5 – Orientada a Objetos (POO)
5.1 – Classes e objetos
5.2 – Herança (simples e múltipla)
5.3 – Polimorfismo
5.4 – Encapsulamento (público, _protegido, __privado)
5.5 – Métodos mágicos (__init__, __call__, __add__, etc.)
5.6 – Propriedades (@property, setter, deleter)
5.7 – Classes abstratas (ABC, abstractmethod)
5.8 – Metaclasses (type, __new__)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Métodos mágicos são funções especiais com underscores duplos. Eles definem como objetos se comportam com operadores nativos. Primeiramente, esses métodos começam e terminam com __. Por exemplo, __init__ constrói objetos, __str__ os exibe. Além disso, __add__ define o operador + para sua classe. A voz passiva é usada aqui: “esses métodos são chamados automaticamente pelo Python”. Quando utilizar métodos mágicos? Para tornar objetos mais naturais. Também para integrar suas classes com a linguagem. Python possui dezenas desses métodos para diferentes propósitos. Vamos explorar os mais importantes com exemplos práticos. Três subtítulos guiarão você pelos principais métodos mágicos. Ao final, você criará classes que parecem tipos nativos.

Construtores, representações e chamadas

__init__ inicializa uma nova instância da classe. __new__ controla a criação do objeto (mais raro). __str__ retorna string amigável para usuários. __repr__ retorna string para depuração (deve recriar objeto). __call__ permite chamar o objeto como uma função. Quando usar cada um? __init__ em praticamente toda classe. __str__ para exibição, __repr__ para logs. __call__ para objetos que se comportam como funções. A voz passiva é aplicada: “a string é gerada automaticamente ao imprimir”. Exemplo desses métodos:

Métodos mágicos de construção tornam suas classes profissionais. __repr__ deve ser o mais explícito possível para depuração.

Operadores aritméticos e comparações

__add__ define +, __sub__ define -. __mul__ define *, __truediv__ define /. __eq__ define ==, __lt__ define <. Quando usar esses métodos? Para criar tipos numéricos personalizados. Por exemplo, vetores, matrizes, dinheiro ou frações. A voz passiva é aplicada: “as operações são sobrecarregadas pelos métodos”. Exemplo completo com operadores aritméticos:

Operadores aritméticos tornam suas classes intuitivas. Use NotImplemented para operações não suportadas.

Métodos de contêiner e gerenciamento de contexto

__len__ define o tamanho (chamado por len()). __getitem__ permite acesso por índice (obj[i]). __setitem__ permite atribuição por índice. __contains__ define o operador in. __enter__ e __exit__ criam gerenciadores de contexto. Quando usar esses métodos? Para criar coleções personalizadas. Também para recursos que precisam de inicialização e limpeza. A voz passiva é aplicada: “o recurso é adquirido e liberado automaticamente”. Exemplo de contêiner e context manager:

Métodos de contêiner tornam suas coleções nativas. A fórmula de utilidade dos métodos mágicos: \(U = \frac{N_{\text{métodos implementados}}}{N_{\text{comportamentos nativos}}} \times 100\%\) Quanto mais métodos mágicos, mais natural sua classe. Comece com __init__, __str__ e __repr__. Depois adicione operadores e métodos de contêiner conforme necessário. Suas classes parecerão tipos nativos da linguagem.