Alura > Cursos de Programação > Cursos de Python > Conteúdos de Python > Primeiras aulas do curso Python: avance na Orientação a Objetos e consuma API

Python: avance na Orientação a Objetos e consuma API

Herança - Apresentação

Olá, este curso será ministrado pela Laís Urano e pelo Guilherme Lima. Boas-vindas a mais um curso de Python!

Autodescrição: Laís se considera uma mulher parda, de olhos e cabelos castanhos, cabelos encaracolados. Enquanto o Guilherme usa óculos, tem barba e cabelo curto. Eles estão nos estúdios da Alura, sentado à uma mesa preta, um de frente para o outro. Sobre a mesa, há dois laptops, um mouse sobre um mousepad e dois microfones. A parede ao fundo tem uma iluminação azul.

Guilherme: Estamos muito felizes de ter você neste curso de Python, orientação a objetos, API, e cada vez mais próximo de um framework do back-end, certo?

Laís: Neste curso, vamos aprender conceitos muito importantes e aprofundar na questão de classes com heranças, polimorfismo, entre outros assuntos.

Guilherme: Além disso, vamos aprender o que são ambientes virtuais e por que eles são muito importantes para conseguirmos isolar dependências e manter nosso projeto cada vez mais performático e seguro, especialmente para quando formos trabalhar com diversos projetos.

Laís: Também vamos abordar um conceito muito importante para o back-end, que é a API.

Guilherme: Neste curso, estaremos mais próximos do Back-end aplicado com Python, mais voltados ao mercado, especificamente com Django, com FastAPI ou com Flask. Então, este é um curso muito importante, principalmente para você que quer aperfeiçoar cada vez mais seus conhecimentos no mundo de Back-end com Python.

Herança - Criando a classe ItemCardapio

Laís: No curso anterior, implementamos um projeto relacionado a restaurantes: cadastramos, listamos os restaurantes e também fizemos a parte de alternar os estados, ou seja, ativar e desativar restaurantes. Agora, precisamos implementar outro ponto do projeto, que é a questão do cardápio, de entrar no restaurante e inserir as informações dele.

Guilherme: Pensando na forma como estamos elaborando o nosso projeto e utilizando o paradigma de orientação a objeto, o objetivo deste curso é aprofundar ainda mais nesse conceito de orientação a objeto.

Com o VS Code aberto, se clicarmos na lista de modelos na lateral esquerda, veremos que temos dois arquivos: avaliacao.py e restaurante.py. Agora, precisamos tratar os itens que esse restaurante tem. Para organizar melhor nosso código, vamos criar uma pasta para manter somente as informações do cardápio.

Laís: Este é o projeto do curso anterior. Vamos disponibilizar para vocês no tópico Preparando Ambiente, caso você não tenha acesso no momento.

Em uma nova pasta, dentro da pasta de modelos onde estamos criando todas as nossas classes, vamos criar uma classe chamada cardapio. Acredito que faz sentido começarmos com a base, um item do cardápio para generalizar tudo.

Vamos criar um novo arquivo dentro da classe cardapio chamado item_cardápio.py. Dentro desse arquivo, vamos criar uma classe chamada ItemCardapio. A primeira coisa que queremos criar em uma classe, queremos ter definidos os parâmetros dessa classe, é um construtor com as informações base dela. Então, a primeira coisa que temos que fazer é o def __init__(). Quais são os parâmetros que precisamos colocar nesse __init__?

Guilherme: Primeiro, todo item que vamos criar, queremos passar o próprio objeto que está instanciando essa classe. Então, de primeira, temos que lembrar do self. Podemos dizer que todo item do cardápio, independente de que tipo ele for, precisa ter um nome e precisa ter um preço. Então, podemos colocar um nome e um preço também.

Laís: Estamos criando essa classe e qualquer tipo de item que podemos inserir no cardápio, seja uma sobremesa, uma bebida, um prato, terá que, obrigatoriamente, ter o nome e o preço dessa informação. E aí, dentro dele, podemos colocar a associação, já que vamos receber de fora. Então, self.nome será igual a nome e self.preço será igual ao preço.

Guilherme: Acredito que podemos manter aqueles padrões que utilizamos nos nossos cursos de colocar o underline antes, para indicar para quem for usar essas classes e dizer: "tenha cuidado na forma como você vai utilizar esses valores porque eles são exclusivos do item cardápio".

class ItemCardapio:
    def __init__(self, nome, preco):
        self._nome = nome
        self._preco = preco

Resumimos a organização do código, como podemos dividir os nossos arquivos, as nossas classes. Acho que podemos criar as nossas classes. Vamos começar com duas classes?

Vamos criar primeiro uma classe nova dentro da pasta de cardapio chamada prato.py. A classe Prato também vai ter um construtor def __init__, e também vamos passar o próprio objeto, self, como primeiro argumento. Queremos o nome, o preço (preco). E podemos dizer que o prato vai ter uma descrição.

Laís: Para não dar erro, vou inserir pass logo abaixo do def __init__.

class Prato:
    def __init__(self, nome, preco, descricao):
        pass

Guilherme: Vamos criar uma outra classe também chamada bebida.py. Aqui você pode usar a ideia de classe que quiser. Quer criar uma classe para sobremesa, uma classe para promoções, itens com desconto, enfim.

Laís: Lembrando que, por questão de organização, toda classe que for do cardápio, estamos colocando dentro da pasta cardapio, que está na pasta modelos, onde estão todas as nossas classes.

A classe Bebida que vamos criar, vai ter que ter um construtor. Esse construtor, vamos passar as informações def __init__, self, e as informações de nome, preço, que falamos que obrigatoriamente todo item vai ter que ter. E também uma informação como tamanho, por exemplo. Se adicionarmos o tamanho, já terá as informações necessárias.

Mas percebam que tanto a classe Prato quanto a classe Bebida têm as informações básicas que falamos anteriormente, que é de nome e preço. E essas informações no nosso arquivo de item_cardapio, está dentro da nossa classe ItemCardapio.

Guilherme: Ainda não existe uma associação do Prato e da Bebida com essa classe ItemCardapio. Queremos que o ItemCardapio seja a classe principal, como se fosse a "classe mãe" que vai dizer: "olha, todas as outras classes dependem da forma como eu vou me comportar, dependem dos meus atributos".

Vamos entender no próximo vídeo como esse paradigma, extremamente importante, não só para o Python, mas para diversas linguagens de programação, funciona. Vamos integrar uma classe a uma classe mãe.

Herança - Herança

Guilherme: O desafio agora é garantir que todas as classes, seja de bebida, prato ou sobremesa, herdem os comportamentos e atributos que nós temos na classe ItemCardapio. Atualmente, não possuímos nenhum comportamento, apenas dois atributos: nome e preço.

O objetivo é que todos os itens tenham, no mínimo, um nome e um preço.

Vamos começar com a classe de prato?

Na classe Prato, a primeira coisa que precisamos fazer para indicar que ela herda informações e atributos da classe ItemCardapio é importá-la. Nós podemos usar o comando import vistos nos cursos passados:

from modelos.cardapio.item_cardapio import ItemCardapio

Para indicar que o prato é uma subclasse do ItemCardapio, escrevemos class Prato(ItemCardapio):. Com essa linha, estamos dizendo que a classe Prato herda métodos e atributos de outra classe. Assim, dentro da classe Prato, teremos informações que podemos usar e ações que podemos realizar que são oriundas de outra classe.

Para usar essas informações, vamos substituir pass por super().__init__(nome, preco). O que está acontecendo aqui? A classe Prato está usando as informações e os atributos da classe ItemCardapio. Sempre que utilizamos a palavra super, estamos acessando informações de outra classe, nesse caso, da classe ItemCardapio.

No entanto, temos um ponto interessante: a descrição não é da classe ItemCardapio, é referente ao prato. Assim, quando herdamos comportamentos e atributos de outra classe, não ficamos presos a usar apenas aquelas informações.

Laís: Podemos criar, da mesma maneira que criamos em qualquer outra classe, o atributo self.descrição e atribuir a ele o valor de descrição que estamos passando.

Estamos aproveitando as coisas da nossa classe base (também chamada de classe mãe ou pai) e também podemos criar o que quisermos. Não somos obrigados a ficar apenas com aquelas informações do ItemCardapio.

from modelos.cardapio.item_cardapio import ItemCardapio

class Prato(ItemCardapio):
    def __init__(self, nome, preco, descricao):
        super().__init__ (nome, preco)
        self.descricao = descricao

Guilherme: A principal vantagem de criar informações de uma classe que queremos usar em outras classes é que conseguimos manter um padrão, uma linha de raciocínio para todas as outras classes.

Por exemplo, na classe Bebida, também faremos um import na primeira linha:

from modelos.cardapio.item_cardapio import ItemCardapio

Laís: Da mesma forma que fizemos com a classe Prato, vamos fazer com a classe Bebida:

class Bebida(ItemCardapio):
    def __init__(self, nome, preco, tamanho):
        super().__init__(nome, preco)
        self.tamanho = tamanho

Nesse caso, substituímos pass por super().__init__(nome, preço) e criamos nosso próprio atributo tamanho.

Guilherme: Esse conceito que estamos vendo agora na programação se chama herança. Ele se refere à capacidade de uma classe herdar características de uma classe base, mas também adicionar ou modificar essas características conforme necessário.

Sobre o curso Python: avance na Orientação a Objetos e consuma API

O curso Python: avance na Orientação a Objetos e consuma API possui 113 minutos de vídeos, em um total de 47 atividades. Gostou? Conheça nossos outros cursos de Python em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Python acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas