Sobes.tech
Middle

O que é um decorador property e para que é usado em Python?

sobes.tech IA

Resposta da IA

property - é um decorador incorporado no Python que permite definir propriedades de classe que se comportam como atributos ao serem acessados, mas podem ter os seus próprios métodos getter, setter e deleter.

É utilizado para:

  1. Controlar o acesso aos atributos: Permite realizar validações, transformações de dados ou outras ações ao obter ou definir o valor de um atributo.
  2. Criar atributos "calculados": O atributo pode não armazenar um valor diretamente, mas calculá-lo em tempo real a cada acesso.
  3. Transição suave de atributos públicos para métodos de acesso: Pode começar com um atributo público simples e depois adicionar lógica usando @property sem alterar o código que usa esse atributo.
  4. Reutilização de lógica getter/setter: Para a mesma propriedade, podem ser definidos getter, setter e deleter. A lógica relacionada a essas operações está centralizada num só lugar.
class MyClass:
    def __init__(self, value):
        self._value = value  # Atributo privado

    @property
    def value(self):  # Getter
        """Devolve o valor."""
        print("Acedeu ao valor")
        return self._value

    @value.setter
    def value(self, new_value):  # Setter
        """Define um novo valor."""
        if not isinstance(new_value, (int, float)):
            raise TypeError("O valor deve ser um número")
        print(f"A definir valor para {new_value}")
        self._value = new_value

    @value.deleter
    def value(self):  # Deleter
        """Remove o valor."""
        print("A remover valor")
        del self._value

# Exemplo de uso
obj = MyClass(10)
print(obj.value)  # Chama o getter
obj.value = 20   # Chama o setter
print(obj.value)
# del obj.value   # Chama o deleter - cuidado, pode causar erros se o atributo for usado mais tarde

Sem @property, teria que usar métodos separados get_value(), set_value(), delete_value(), o que é menos conveniente para o acesso aos dados.