Em Python, os descritores e atributos controlados explicam como melhor estruturar objetos

Em Python, os descritores e atributos controlados explicam como melhor estruturar objetos
2 min de lecture

Os descritores de Python permitem controlar o que acontece quando se lê, modifica ou elimina um atributo de um objeto. Um tutorial detalha como usá-los para construir três tipos de atributos controlados: validados, calculados e carregados a pedido. Ilustra a abordagem com um exemplo fictício de uma aplicação de turismo no Japão.

Um descritor é uma classe que implementa métodos como __get__, __set__ ou __delete__, que definem o comportamento de um atributo. Nem todos são obrigatórios. O método __set_name__, introduzido com Python 3.6, indica ao descritor o nome do atributo a que está associado, permitindo armazenar o valor no __dict__ do objeto pai sem conflitos de nomes. Segundo o autor, esta abordagem evita sobrecarregar o código com decoradores @property, getters e setters.

Atributos validados, calculados ou preguiçosos

O primeiro exemplo, chamado ValidatedRating, verifica que uma classificação é um número (inteiro ou decimal) compreendido entre um valor mínimo e um máximo, definidos por omissão como 1.0 e 5.0. Em caso de valor não numérico, levanta uma TypeError; se o valor estiver fora do intervalo, uma ValueError.

O segundo, ComputedUSDPrice, serve para mostrar em dólares americanos um preço armazenado em ienes japoneses (JPY). Calcula a conversão dinamicamente, a partir de uma taxa de câmbio de 0.0067, indicada no código como uma aproximação. O atributo sendo de apenas leitura, qualquer tentativa de escrita desencadeia uma AttributeError.

O terceiro, LazyItinerary, aplica-se a dados dispendiosos de produzir, como a leitura de um ficheiro JSON grande ou a consulta a uma base de dados de horários dos Shinkansen, os comboios de alta velocidade japoneses. O descritor só calcula o valor na primeira consulta, coloca-o no __dict__ da instância e depois retira-se. As consultas seguintes leem diretamente esse valor. No exemplo, é incluída uma simulação de latência de um segundo.

Aplicação prática com uma visita a Quioto

Estes três descritores são reunidos numa classe JapanTour. Na inicialização com um destino «Kyoto», um preço de 45000 JPY e uma classificação de 4.8, a validação é desencadeada imediatamente. Quando o autor tenta depois atribuir o valor 6.0 à classificação, a exceção é interceptada e a mensagem «rating must be between 1.0 and 5.0.» é exibida.

A primeira consulta do itinerário mostra a mensagem de simulação de pedido, depois três dias de programa: chegada e check-in em Quioto, visita guiada a templos e degustação de comida de rua, e partida em Shinkansen. Na segunda consulta, a mensagem já não aparece: o valor é lido diretamente da instância.

O artigo conclui que estes três tipos de descritores reforçam a robustez dos atributos de classe, assegurando respetivamente a integridade dos dados, o cálculo de valores derivados e a gestão de operações dispendiosas.