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 Circle
que possui um radius
atributo e um area()
método:
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
Linguagem de código: Python ( python )
E o seguinte cria um novo Circle
objeto e retorna sua área:
c = Circle(10)
print(c.area())
Linguagem de código: Python ( python )
Saída:
314.1592653589793
Linguagem de código: Python ( python )
Este código funciona perfeitamente bem.
Mas seria mais natural que a área fosse uma propriedade do Circle
objeto e não um método. Para tornar o area()
método uma propriedade da Circle
classe, você pode usar o @property
decorador 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 radius
atributo. 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 Circle
classe com area
propriedade 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._area
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina _area
to None
no __init__
método. O atributo _area é o cache que armazena a área calculada.
Segundo, se o raio mudar (no setter), redefina _area
para None
.
Terceiro, defina a area
propriedade computada. A area
propriedade retorna _area
se não for None
. Caso contrário, calcule a área, salve-a no arquivo _area
e 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.