{ "metadata": { "name": "Capitulo20_Heranca_multipla" }, "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 20: Heran\u00e7a m\u00faltipla\n", "=============================\n", "_____________________________\n", "Na heran\u00e7a m\u00faltipla, a nova classe deriva de duas ou mais classes j\u00e1 existentes.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Terrestre(object):\n", " \"\"\"\n", " Classe de ve\u00edculos terrestres\n", " \"\"\"\n", " se_move_em_terra = True\n", "\n", " def __init__(self, velocidade=100):\n", " \"\"\"\n", " Inicializa o objeto\n", " \"\"\"\n", " self.velocidade_em_terra = velocidade\n", "\n", "\n", "class Aquatico(object):\n", " \"\"\"\n", " Classe de ve\u00edculos aquaticos\n", " \"\"\"\n", " se_move_na_agua = True\n", "\n", " def __init__(self, velocidade=5):\n", " \"\"\"\n", " Inicializa o objeto\n", " \"\"\"\n", " self.velocidade_agua = velocidade\n", "\n", "\n", "class Carro(Terrestre):\n", " \"\"\"\n", " Classe de carros\n", " \"\"\"\n", " rodas = 4\n", "\n", " def __init__(self, velocidade=120, pistoes=4):\n", " \"\"\"\n", " Inicializa o objeto\n", " \"\"\"\n", " self.pistoes = pistoes\n", " Terrestre.__init__(self, velocidade=velocidade)\n", "\n", "\n", "class Barco(Aquatico):\n", " \"\"\"\n", " Classe de barcos\n", " \"\"\"\n", " def __init__(self, velocidade=6, helices=1):\n", " \"\"\"\n", " Inicializa o objeto\n", " \"\"\"\n", " self.helices = helices\n", " Aquatico.__init__(self, velocidade=velocidade)\n", "\n", "\n", "class Anfibio(Carro, Barco):\n", " \"\"\"\n", " Classe de anf\u00edbios\n", " \"\"\"\n", " def __init__(self, velocidade_em_terra=80,\n", " velocidade_na_agua=4, pistoes=6, helices=2):\n", " \"\"\"\n", " Inicializa o objeto\n", " \"\"\"\n", " # \u00c9 preciso evocar o __init__ de cada classe pai\n", " Carro.__init__(self, velocidade=velocidade_em_terra,\n", " pistoes=pistoes)\n", " Barco.__init__(self, velocidade=velocidade_na_agua,\n", " helices=helices)\n", "\n", "\n", "novo_anfibio = Anfibio()\n", "\n", "for atr in dir(novo_anfibio):\n", "\n", " # Se n\u00e3o for m\u00e9todo especial:\n", " if not atr.startswith('__'):\n", " print atr, '=', getattr(novo_anfibio, atr)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "helices = 2\n", "pistoes = 6\n", "rodas = 4\n", "se_move_em_terra = True\n", "se_move_na_agua = True\n", "velocidade_agua = 4\n", "velocidade_em_terra = 80\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A diferen\u00e7a mais significativa em rela\u00e7\u00e3o \u00e0 heran\u00e7a simples \u00e9 a ordem de resolu\u00e7\u00e3o de m\u00e9todos (em ingl\u00eas, *Method Resolution Order*- MRO).\n", "\n", "![MRO - Heran\u00e7a m\u00faltipla](files/bpypd_diags18.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nas classes *old style*, a resolu\u00e7\u00e3o come\u00e7a pela classe mais a esquerda e desce at\u00e9 o fim da hierarquia e depois passa para o ramo a direita.\n", "\n", "J\u00e1 nas classes new style, a resolu\u00e7\u00e3o \u00e9 feita a partir da esquerda, descendo at\u00e9 encontrar a classe em comum entre os caminhos dentro hierarquia. Quando \u00e9 encontrada uma classe em comum, a procura passa para o caminho \u00e0 direita. Ao esgotar os caminhos, o algoritmo prossegue para a classe em comum e repete o processo.\n", "\n", "Na hierarquia de classes do exemplo, a *MRO* para a classe dos anf\u00edbios ser\u00e1:\n", "\n", " [,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]\n", " \n", "A heran\u00e7a m\u00faltipla \u00e9 um recurso que gera muita controv\u00e9rsia, pois seu uso pode tornar o projeto confuso e obscuro." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }