Aventurando-se com Python
Quinta Aula
Classes e Objetos
'''
Por enquanto, pense nas Classes como um conjunto de variáveis, constantes
e funções. Só que em uma Classe, as variáveis e as constantes são chamados
de atributos e as funções de métodos. Utilizando uma Classe, eu posso
reutilizar esses atributos e métodos por várias partes do meu projeto.
Classes são feitas para representar coisas do mundo real, como um carro ou
uma pessoa.
'''
# Definindo uma Classe...
class Pessoa():
def __init(self, nome, idade)__:
self.nome = nome
self.idade = idade
'''
O que eu fiz foi criar uma Classe para representar uma pessoa. Essa pessoa
tem nome e idade. Ela pode ter qualquer característica de uma pessoa real,
como cpf, altura e até sentimentos. Bem, não sentimentos de verdade.
Apenas uma representação deles. Percebem o que tenho agora? Eu tenho uma
'estruturade dados' que eu posso manipular e resolver problemas
relacionadosà pessoas. Por exemplo, tratar informações de um censo
demográfico. O que eu preciso agora é instanciar essa classe e a atribuir
à uma variável para poder usá-la. Instanciar é criar uma implementação da
Classe. É tornar a Classe, um objeto.
'''
# Executando...
pessoa = Pessoa('Rodolfo', 23)
# Agora eu posso usar a variável pessoa e seus atributos
print(pessoa.nome) # Rodolfo
'''
O método __init__ é o responsável por instanciar a minha classe.
''''''
Eu posso definir que uma Classe é uma especificação de outra Classe.
Por exemplo, um empresário é uma pessoa com algumas características
específicas. Mas ele não deixa de ter características comuns a pessoas.
Então, eu posso dizer: Um empresário é uma pessoa.
Na programação orientada a objetos, eu represento isso através de herança.
É quando uma Classe herda as características de outra. Geralmente, uma
classe específica herda de uma classe geral.
'''
# Definindo uma geral. Ela representa todas as pessoas. Por isso, é geral.
class Pessoa():
def __init__(self, nome, idade)__:
self.nome = nome
self.idade = idade
def apresentacao(self):
return 'Oi, eu sou uma pessoa'
# Definindo uma herança. Uma especialização de Pessoa.
class Empresario(Pessoa):
def __init__(self, nome, idade, cnpj):
self.nome = nome
self.idade = idade
self.cpnj = cnpj
'''
A Classe Empresário tem todas as características da classe Pessoa.
'''
empresario = Empresario('Alex Martins', 43, 000000.0000)
empresario.apresentacao() # Oi, eu sou uma pessoa
'''
Observe, Empresário tem tudo o que pessoa tem. Mas pessoa não tem tudo
o que um Empresário tem. Podemos definir atributos e métodos específicos
para Empresário.
'''
class Empresario(Pessoa):
def __init__(self, nome, idade, cnpj):
self.nome = nome
self.idade = idade
self.cpnj = cnpj
def contratar_pessoa():
pass'''
Eu posso fazer com que a minha classe filha, nesse caso, Empresário,
mude algumas características da classe pai, Pessoa. Por exemplo, métodos.
Isso se chama sobrescrita de métodos. Já fizemos isso com o método
__init__() de Empresario. Você percebeu? Nós adicionamos o atributo
cnpj. Para sobrescrever um método, basta eu criar um método de mesmo nome
de um método existente na classe pai. Em empresário, nós poderíamos
sobrescrito o método apresentação().
'''
class Empresario(Pessoa):
def __init__(self, nome, idade, cnpj):
self.nome = nome
self.idade = idade
self.cpnj = cnpj
def apresentacao():
return 'Oi, eu sou um empresário''''
Eu posso de dentro da minha Classe filha, fazer referência a minha Classe
pai. Para isso uso o super(). Observe.
'''
class Empresario(Pessoa):
def __init__(self, nome, idade, cnpj):
super().__init__(nome, idade)
self.cpnj = cnpj
def apresentacao():
return 'Oi, eu sou um empresário'