{
"metadata": {
"name": "Capitulo21_Propriedades"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Cap\u00edtulo 21: Propriedades\n",
"=============================\n",
"_____________________________\n",
"Propriedades (*properties*) s\u00e3o atributos calculados em tempo de execu\u00e7\u00e3o. As propriedades s\u00e3o criadas atrav\u00e9s da fun\u00e7\u00e3o / decorador *property*.\n",
"\n",
"O uso de propriedades permite:\n",
"\n",
"+ Validar a entrada do atributo.\n",
"+ Criar atributos apenas de leitura.\n",
"+ Simplificar o uso da classe.\n",
"+ Mudar de um atributo convencional para uma propriedade sem a necessidade de alterar as aplica\u00e7\u00f5es que utilizam a classe.\n",
"\n",
"Exemplo de c\u00f3digo sem propriedades:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# get_*, set_*...\n",
"\n",
"\n",
"class Projetil(object):\n",
"\n",
" def __init__(self, alcance, tempo):\n",
"\n",
" self.alcance = alcance\n",
" self.tempo = tempo\n",
"\n",
" def get_velocidade(self):\n",
"\n",
" return self.alcance / self.tempo\n",
"\n",
"\n",
"moab = Projetil(alcance=10000, tempo=60)\n",
"\n",
"print moab.get_velocidade()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"166\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exemplo de propriedade atrav\u00e9s de decorador:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Exemplo de property de leitura\n",
"\n",
"\n",
"class Projetil(object):\n",
"\n",
" def __init__(self, alcance, tempo):\n",
"\n",
" self.alcance = alcance\n",
" self.tempo = tempo\n",
"\n",
" @property\n",
" def velocidade(self):\n",
"\n",
" return self.alcance / self.tempo\n",
"\n",
"\n",
"moab = Projetil(alcance=10000, tempo=60)\n",
"\n",
"# A velocidade \u00e9 calculada\n",
"print moab.velocidade"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"166\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exemplo de propriedade atrav\u00e9s de chamada de fun\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Property de leitura e escrita\n",
"\n",
"\n",
"class Projetil(object):\n",
"\n",
" def __init__(self, alcance, tempo):\n",
"\n",
" self.alcance = alcance\n",
" self.tempo = tempo\n",
"\n",
" # Calcula a velocidade\n",
" def getv(self):\n",
"\n",
" return self.alcance / self.tempo\n",
"\n",
" # Calcula o tempo\n",
" def setv(self, v):\n",
"\n",
" self.tempo = self.alcance / v\n",
"\n",
" # Define a propriedade\n",
" velocidade = property(getv, setv)\n",
"\n",
"\n",
"moab = Projetil(alcance=10000, tempo=60)\n",
"print moab.velocidade\n",
"\n",
"# Muda a velocidade\n",
"moab.velocidade = 350\n",
"print moab.tempo"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"166\n",
"28\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Propriedades s\u00e3o particularmente interessantes para quem desenvolve bibliotecas para serem usadas por outras pessoas."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}