Conteúdo[Esconder][Mostrar]
Nesta palestra, aprenderemos sobre classes, construtores e herança em python.
Esses conceitos são realmente importantes em um grande programa onde diferentes tipos precisam ser definidos.
Classes
As classes são essenciais na programação e não são específicas para python. Muitos outros linguagens de programação apoiar a noção de classes. Usamos classes para definir novos tipos de dados.
Até agora, aprendemos sobre os tipos de dados básicos em Python, como números, strings e booleanos. Esses são os tipos de dados básicos ou simples em Python. Também vimos alguns tipos de dados complexos, como listas e dicionários.
Embora esses tipos sejam extremamente úteis, eles nem sempre podem ser usados para modelar conceitos complexos. Por exemplo, pense na ideia de um ponto ou de um carrinho de compras. Um carrinho de compras não é um booleano ou uma lista. É um tipo diferente de dados. Assim, podemos usar classes para definir novos tipos para modelar conceitos reais.
Agora, vamos definir um novo tipo de dados chamado ponto. Este novo tipo terá métodos como verificamos antes.
É assim que você vai fazer:
Começamos definindo uma classe usando a palavra-chave “class” e logo em seguida damos um nome à nossa classe.
class Point
Agora, veja a convenção de nomenclatura que usei aqui. Eu coloquei a primeira letra em maiúscula aqui, isso é o que chamamos de convenção de nomenclatura pascal. Essa convenção é diferente daquela que usamos para nomear nossas variáveis e funções para as quais sempre usamos letras minúsculas e separamos várias palavras usando um sublinhado. Mas ao nomear classes, não usamos um sublinhado para separar várias palavras, em vez disso, colocamos em maiúscula a primeira letra de cada palavra.
Depois de definir nossa classe, dois pontos são usados, o que significa que agora um bloco está definido.
class Point:
def move (self):
Neste bloco podemos definir todas as funções ou métodos que pertencem aos pontos. Por exemplo, podemos definir uma função chamada “move” para mover um ponto. Observe que, assim que digitamos parênteses abertos, o PyCharm adiciona automaticamente “self” aqui. Esta é uma palavra-chave especial e deixe-me voltar a isso em breve. Vamos imprimir “mover” no terminal.
print("move")
Vamos definir outro método como “draw” e imprimi-lo no terminal.
def draw(self):
print("draw")
Terminamos com a definição da nossa classe “ponto”. Com este novo tipo, podemos criar novos objetos. Uma classe simplesmente define o blueprint ou o modelo para criar objetos que são as instâncias reais com base nesse blueprint. Para criar um objeto, digitamos o nome de nossa classe e então a chamamos como uma função. Isso cria um novo objeto e o retorna. Então podemos armazenar esse objeto em uma variável. Deixe-me te mostrar:
Aqui definimos um “ponto1” que é um ponto tridimensional. Você pode ver que, podemos imprimir coordenadas individuais no terminal.
Podemos usar os dois métodos “desenhar” e “mover” com este ponto.
Então, para recapitular, usamos classes para definir novos tipos e esses tipos podem ter métodos que definimos no corpo da classe. As classes podem ter atributos que podemos definir em qualquer lugar em nossos programas.
Construtores
Até agora, aprendemos como criar novos tipos usando classes. Agora há um pequeno problema com esta implementação. Podemos criar um objeto de ponto sem uma coordenada x ou y usando classes e isso não é o ideal. Deixe-me te mostrar.
Vamos criar um ponto e imprimi-lo antes de definir a coordenada x. A execução do nosso programa resulta em um erro de atributo como este:
Isso significa que o objeto de ponto não tem um atributo chamado x. Agora o problema é que é possível ter um objeto pontual sem coordenadas x ou y. Isso não faz sentido, pois sempre que falamos sobre um ponto, precisamos saber onde esse ponto está localizado. Para resolver este problema, usamos um construtor. Um construtor é uma função que é chamada no momento da criação de um objeto.
Aqui está como usamos um construtor. Primeiro, vamos passar os valores das coordenadas xey no programa acima.
point = Point(10, 20)
print(point.x)
Agora, precisamos adicionar um método especial nesta classe chamado construtor. Sua sintaxe é assim:
def __init__(self, x, y):
init
é a abreviação de inicializado, e esta é a função ou o método que é chamado quando um novo objeto de ponto é criado. O x e y são adicionados logo após self
para adicionar dois parâmetros extras.
Depois disso, devemos mapear o x e y para os valores passados, ou seja, 10 e 20
self.x = x
self.y = y
Usamos o self
para se referir ao objeto atual e então definimos o atributo x para o argumento x passado para a função “x”. Desta forma, usando init
método, podemos inicializar nossos objetos. Esse método é chamado de construtor. Vamos executar nosso programa.
Agora, podemos alterar as coordenadas x e y mais tarde. Vamos atualizar a coordenada x:
point = Point(10, 20)
point.x = 11
print(point.x)
Agora, a coordenada x é atualizada para o valor 11.
Exercício
Aqui está um exercício interessante para você.
Eu quero que você defina um novo tipo chamado pessoa. Esses objetos "Person" devem ter um "name
” atributo, bem como um “talk()
”.
É uma tarefa simples e não deve demorar mais do que alguns minutos.
Solução
Comece definindo a classe “Pessoa” assim:
class Person:
self.name = name
Vamos definir o construtor mais tarde. Agora, podemos criar o objeto “Person”. Vamos chamá-lo de João
john = Person("John Smith")
print(john.name)
john.talk()
Agora, vá para a primeira parte do código e crie um construtor.
def __init__(self, name):
O código final será semelhante a este:
Você também pode usar strings formatadas e outros conceitos em conjunto com classes e construtores.
Herança
A herança é outro conceito associado a classes que permitem reutilizar um código.
Considere este pedaço de código.
class Dog:
def walk(self):
print("walk")
Criamos uma classe “Dog” com um método “walk”. Nesse método, estamos simplesmente imprimindo a mensagem de caminhada no terminal. Digamos que, em um programa real, existem 10 linhas de código em vez de apenas uma linha aqui. No futuro, se for necessária outra classe para ter o método “walk”, teremos que repetir todo esse código. Isso não é o ideal.
Na programação, temos um princípio chamado DRY que é a abreviação de não se repetir. Digamos que em algum momento no futuro, descobrimos um problema com nosso método “walk” e se tivermos repetido ou duplicado esse método em muitos outros lugares, teremos que voltar e corrigir esse problema em todos os lugares em que duplicamos isso código. Então é por isso que na programação não devemos definir algo duas vezes.
Existem diferentes abordagens para resolver esse problema, mas aqui vamos aprender a que é mais fácil para iniciantes e é chamada de herança. Nesse caso, criaremos outra classe “mamífero” e definiremos nosso atributo “caminhar” nessa classe.
class Mammal:
def walk(self):
print("walk")
Depois de definir nossa classe “Mammal”, podemos usar herança para passar os atributos assim:
Ambas as classes dog e cat estão herdando todos os métodos de classe definidos em sua classe pai. Agora, podemos adicionar métodos específicos para cães como este:
class Dog:
def bark(self):
print("bark")
Embrulhar!
Isso foi tudo sobre as classes, construtores e reutilização do código em classes com conceitos de herança. Agora estamos chegando ao fim da nossa série. A essa altura, você deve ser capaz de produzir códigos bons, legíveis e concisos em Python.
Veremos o conceito de módulos e pacotes na próxima palestra.
Deixe um comentário