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