{ "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": {} } ] }