Propriedade somente leitura do Python

Resumo : neste tutorial, você aprenderá como definir a propriedade somente leitura do Python e como usá-la para definir propriedades computadas.

Introdução à propriedade somente leitura do Python

Para definir uma propriedade readonly , você precisa criar uma propriedade apenas com o getter. No entanto, não é verdadeiramente somente leitura porque você sempre pode acessar o atributo subjacente e alterá-lo.

As propriedades somente leitura são úteis em alguns casos, como para propriedades computadas.

O exemplo a seguir define uma classe chamada Circleque possui um radiusatributo e um area()método:

import math


class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return math.pi * self.radius ** 2Linguagem de código:  Python  ( python )

E o seguinte cria um novo Circleobjeto e retorna sua área:

c = Circle(10)
print(c.area())Linguagem de código:  Python  ( python )

Saída:

314.1592653589793Linguagem de código:  Python  ( python )

Este código funciona perfeitamente bem.

Mas seria mais natural que a área fosse uma propriedade do Circleobjeto e não um método. Para tornar o area()método uma propriedade da Circleclasse, você pode usar o @propertydecorador da seguinte forma:

import math


class Circle:
    def __init__(self, radius):
        self.radius = radius

    @property
    def area(self):
        return math.pi * self.radius ** 2


c = Circle(10)
print(c.area)Linguagem de código:  Python  ( python )

A área é calculada a partir do radiusatributo. Portanto, costuma ser chamada de propriedade calculada ou computada.

Propriedades calculadas em cache

Suponha que você crie um novo objeto circular e acesse a propriedade area várias vezes. A cada vez a área precisa ser recalculada, o que não é eficiente.

Para torná-lo mais eficiente, você precisa recalcular a área do círculo somente quando o raio mudar. Se o raio não mudar, você poderá reutilizar a área calculada anteriormente.

Para fazer isso, você pode usar a técnica de cache:

  • Primeiro, calcule a área e salve-a em um cache.
  • Segundo, se o raio mudar, redefina a área. Caso contrário, retorne a área diretamente do cache sem recálculo.

O seguinte define a nova Circleclasse com areapropriedade em cache:

import math


class Circle:
    def __init__(self, radius):
        self._radius = radius
        self._area = None

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError('Radius must be positive')

        if value != self._radius:
            self._radius = value
            self._area = None

    @property
    def area(self):
        if self._area is None:
            self._area = math.pi * self.radius ** 2

        return self._areaLinguagem de código:  Python  ( python )

Como funciona.

Primeiro, defina _areato Noneno __init__método. O atributo _area é o cache que armazena a área calculada.

Segundo, se o raio mudar (no setter), redefina _areapara None.

Terceiro, defina a areapropriedade computada. A areapropriedade retorna _arease não for None. Caso contrário, calcule a área, salve-a no arquivo _areae retorne-a.

Resumo

  • Defina apenas o getter para tornar uma propriedade somente leitura
  • Use propriedade computada para tornar a propriedade de uma classe mais natural
  • Use o cache de propriedades computadas para melhorar o desempenho.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *