Back-End

22 out, 2012

Qual é o sentido das propriedades em Python?

Publicidade

Alguns dias atrás uma colega me perguntou qual era o sentido das propriedades em Python. Afinal, escrever propriedades exige tanto quanto escrever um getter, ou um setter e elas realmente não adicionam qualquer funcionalidade – com exceção de não ter que escrever ‘()’ no acesso.

Superficialmente, esse argumento se atém a comparar uma classe simples implementada com getters e setters, e com propriedades.

Implementadas com getters e setters

>>> class GetSet(object):
...   x = 0
...   def set_x(self, x):
...     self.x = x
...   def get_x(self):
...     return self.x
...

>>> getset = GetSet()
>>> getset.set_x(3)
>>> getset.get_x()
3

Implementadas com as propriedades

>>> class Props(object):
...   _x = 0
...   @property
...   def x(self):
...     return self._x
...   @x.setter
...   def x(self, x):
...     self._x = x
...
>>> props = Props()
>>> props.x = 5
>>> props.x
5

A questão

Na verdade, nós fomos de 196 a 208 chars neste caso de uso simples – então, por que usamos propriedades em tudo? A resposta é que, neste caso de uso, nós não usaríamos. Na verdade, poderíamos escrever assim:

>>> class MyClass(object):
...   x = 0
...
>>> my = MyClass()
>>> my.x = 4
>>> my.x
4

Eu posso ouvir você gritando: “Mas, não há encapsulamento!”. O que vamos fazer se precisarmos controlar o acesso à x, torná-lo somente leitura ou fazer outra coisa com ele? Não vamos ter que refazer tudo para os getters e setters que evitamos?

Não, nós temos apenas que mudar para a versão apropriada, adicionar o que desejamos, e não se alterar a interface. A melhor coisa das propriedades não é que elas substituem getters e setters, é que você não precisa escrever o seu código à prova do futuro. Você pode começar escrevendo a implementação mais simples que se possa imaginar, e se mais tarde você precisar alterar a implementação, você ainda pode fazer isso sem alterar a interface. Bom, hein?

***

Artigo original disponível em: http://blaag.haard.se/What-s-the-point-of-properties-in-Python/#disqus_thread