Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Introdução a programação orientada a objeto em python, Resumos de Programação em Python

Introdução aos principais conceitos básicos de programação orientada a objeto em python.

Tipologia: Resumos

2021

Compartilhado em 10/05/2021

arthur-chabole
arthur-chabole 🇧🇷

4.4

(5)

1 documento

1 / 12

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Insights classes e objetos - equipe Zebra 2021
'Este algoritmo é um resumo dos principais conceitos de programação orientada a objeto.'
Revisão de funções
Em python uma função pode ser o argumento de outra função. Ou o retorno de uma determinada
função pode ser outra função.
result_1= 6, result_2= 9
Uma função retornando outra função
Alô, Quem fala ?
Chamada perdida :(
Uma função sendo usada no corpo de uma outra funcão
In[180
# __Version__ : 0.0.1
# __Release__: Arthur Chabole 04/05/21
'''Este algoritmo é um resumo dos principais conceitos de programação orientada a objeto.
Out[180
In[42]:
#importando bibliotecas
import numpy as np
import matplotlib.pyplot as plt
In[208
#função sendo usada como argumento de outra função
def soma_1(x):
return x + 1
def subt_1(x):
return x - 1
def calculadora(operação, x):
#Usando a função operação dentro do argumento da função calc
resultado = operação(x)
return resultado
In[219
#Usando as funções
result_1 = calculadora(soma_1, 5)
result_2 = calculadora(subt_1, 10)
print(f'result_1= {result_1}, result_2= {result_2}')
In[240
#Composição de funções
def chamada_telefone(responder: bool):
#Só aceita valores True ou False (valor booleano)
if responder:
def aceitar():
print('Alô, Quem fala ?')
return None
#Retorno da função aceitar()
return aceitar()
#Retorno da função chamada_telefone()
else:
def desligar():
print('Chamada perdida :(')
return None
#Mostrar que a função aceitar() não retorna nada só 'printa'
return desligar()
In[241
#Usando a composição de funções. função chamada_telefone()
aceitando_ligação = chamada_telefone(True)
Recusando_ligação = chamada_telefone(False)
pf3
pf4
pf5
pf8
pf9
pfa

Pré-visualização parcial do texto

Baixe Introdução a programação orientada a objeto em python e outras Resumos em PDF para Programação em Python, somente na Docsity!

Insights classes e objetos - equipe Zebra 2021

'Este algoritmo é um resumo dos principais conceitos de programação orientada a objeto.'

Revisão de funções

Em python uma função pode ser o argumento de outra função. Ou o retorno de uma determinada função pode ser outra função.

result_1= 6, result_2= 9 Uma função retornando outra função

Alô, Quem fala? Chamada perdida :( Uma função sendo usada no corpo de uma outra funcão

In [180…^ #^ Version^ :^ 0.0.

Release: Arthur Chabole 04/05/

'''Este algoritmo é um resumo dos principais conceitos de programação orientada a objeto.

Out[180…

In [42]: #importando bibliotecas import numpy as np import matplotlib.pyplot as plt

In [208…^ #função^ sendo^ usada^ como^ argumento^ de^ outra^ função def soma_1(x): return x + 1

def subt_1(x): return x - 1

def calculadora(operação, x): #Usando a função operação dentro do argumento da função calc resultado = operação(x) return resultado

In [219…^ #Usando^ as^ funções result_1 = calculadora(soma_1, 5) result_2 = calculadora(subt_1, 10)

print(f'result_1= {result_1}, result_2= {result_2}')

In [240…^ #Composição^ de^ funções def chamada_telefone(responder: bool):#Só aceita valores True ou False (valor booleano) if responder: def aceitar(): print('Alô, Quem fala ?') return None #Retorno da função aceitar() return aceitar()#Retorno da função chamada_telefone() else : def desligar(): print('Chamada perdida :(') return None #Mostrar que a função aceitar() não retorna nada só 'printa' return desligar()

In [241…^ #Usando^ a^ composição^ de^ funções.^ função^ chamada_telefone() aceitando_ligação = chamada_telefone( True ) Recusando_ligação = chamada_telefone( False )

email: [email protected], com 22 anos

Diferença entre variáveis locais e globais

Acessando variáveis globais código

[email protected] Não conseguimos acessar as variáveis internas (locais) das funções, mas podemos de objetos. Exemplo:

NameError Traceback (most recent call last) **** in ----> 1 print ( meu_nome , nova_idade )

NameError : name 'meu_nome' is not defined

Tudo em python é um objeto de uma determinada classe

Até as funções acima são 'tratadas' como objeto de uma classe

def pessoa e def fazer_aniversário são na verdade uma classe 'function' dentro de python

Criando sua primeira classe

In [242…^ #função^ pessoa def pessoa(meu_nome, meu_sobrenome, minha_idade): email = f'{meu_nome}.{meu_sobrenome}@unesp.br' nova_idade = fazer_aniversário(minha_idade) #usando a função aniversário dentro da f return email, nova_idade #Retornando 2 parâmetros

#função fazer aniversário def fazer_aniversário(idade): idade += 1 return idade

In [243…^ #Usando^ a^ função^ pessoa email, idade = pessoa('Arthur', 'Chabole', 21)

#Usando a função aniversário minha_idade = fazer_aniversário(25)

#Ver as variavéis retornadas da função print(f'email: {email}, com {idade} anos')

In [244… print(minha_idade) print(email)

In [245…^ print(meu_nome, nova_idade)

In [44]:^ #Vendo^ tipo^ das^ funções print(type(pessoa)) print(type(fazer_aniversário))

In [2]:^ #Criando^ sua^ classe class Pessoa():

#Método construtor da classe Pessoa

Nome: Rafael Sobrenome: Chabole Idade: 6 Altura: 1. Humor: feliz

Aplicando os métodos da classe

Diferença entre atributos e métodos

AttributeError Traceback (most recent call last) **** in ----> 1 p1. email #Atributos

AttributeError : 'Pessoa' object has no attribute 'email' Erro pois o atributo email do objeto só é criado após a execução da método email(). Assim, o atributo email do objeto p1 ainda não existe.

'[email protected]'

A Pessoa Rafael tem 6 anos, 1.25m e está feliz

Modificando o objeto p

A Pessoa Rafael tem 6 anos, 1.4m e está feliz

A Pessoa Rafael tem 6 anos, 1.45m e está feliz

A Pessoa Rafael tem 7 anos, 1.45m e está feliz

Construindo objetos a partir de array's com iteradores

print(f'Sobrenome: {p1. sobrenome}') print(f'Idade: {p1. idade}') print(f'Altura: {p1. altura}') print(f'Humor: {p1. humor}')

In [19]:^ p1. email #Atributo

In [24]:^ p1. criar_Email() #Método

In [25]: p1. email #Atributo

Out[25]:

In [23]:^ p1. apresentar() #Método

In [38]: #Métodos p1. crescer_15cm()

p1. apresentar()

In [39]:^ #Métodos p1. crescer_Xcm(5)

p1. apresentar()

In [40]:^ #Métodos p1. aniversário()

p1. apresentar()

In [91]: #Informações que queremos construir

[<main.Pessoa at 0x1f6da3c0880>, <main.Pessoa at 0x1f6da3c08e0>, <main.Pessoa at 0x1f6da3c0250>, <main.Pessoa at 0x1f6da3c0d90>]

A Pessoa Arthur tem 21 anos, 1.86m e está Feliz A Pessoa Gabriel tem 20 anos, 1.8m e está Neutro A Pessoa Maria tem 20 anos, 1.7m e está Triste A Pessoa Thiago tem 23 anos, 1.82m e está Neutro Buscando informações dos objetos

[('Arthur', 'Chabole', 1.86, 'Feliz'), ('Gabriel', 'Messias', 1.8, 'Neutro'), ('Maria', 'Alcantara', 1.7, 'Triste'), ('Thiago', 'Cacique', 1.82, 'Neutro')]

Conceito de herança

A Pessoa Arthur tem 24 anos, 2.31m e está feliz Quando a classe Funcionário herda a classe Pessoa. Ganhamos de presente os atributos e métodos desenvolvida anteriormente na classe Pessoa para dentro da classe Funcionário. Assim, podemos de maneira simples reutilizar o trabalho antigo ou de outras pessoas.

Complementando a classe Funcionário

nomes = np. array(('Arthur', 'Gabriel', 'Maria', 'Thiago')) sobrenomes = np. array(('Chabole', 'Messias', 'Alcantara','Cacique')) idades = np. array((21, 20, 20, 23)) alturas = np. array((1.86, 1.80, 1.7, 1.82)) humores = np. array(('Feliz', 'Neutro', 'Triste', 'Neutro'))

#Iterando pessoas = [] for (nome, sobrenome, idade, altura, humor) in zip(nomes, sobrenomes, idades, alturas, hum pessoas. append((Pessoa(nome, sobrenome, idade, altura, humor)))

pessoas

Out[91]:

In [92]:^ #Mostrando^ as^ pessoas^ criadas for pessoa in pessoas: pessoa. apresentar()

In [93]:^ info = [] for pessoa in pessoas: info. append((pessoa. nome, pessoa. sobrenome, pessoa. altura, pessoa. humor)) #importante info

Out[93]:

In [104… #Herdando os atributos e métodos da classe Pessoa class Funcionário(Pessoa): pass

In [105… f1 = Funcionário('Arthur', 'Chabole', 21, 1.86, 'feliz')

In [108… f1. humor = 'neutro'

f1. aniversário() f1. crescer_15cm()

f1. apresentar()

In [85]:^ #Acrescentando^ um^ construtor^ &^ novos^ métodos

Métodos com decorator @Property

São métodos para serem chamados como com atributo. Sem a necessidade de utilizar '()'

Arthur, engenheiro salário de R$5000. Taxa de aumento 0.05% anual

Métodos com decorator @classmethod

São métodos reservados para serem usados pela classe. Suas modificações alteram para todos os objetos da classe.

#Variáveis da classe Funcionário cont_func = 0 #Contador de funcionário Taxa_aumento = 1.05 #Taxa de aumento

def init(self, nome, sobrenome, idade, altura, humor, cargo, salário):

#Chamando os atributos herdados de Pessoa super(). init(nome, sobrenome, idade, altura, humor)

#Acrescentando novos atributos ("variável do objeto") self. cargo = cargo self. salário = salário

#Métodos da classe Funcionário. add_Funcionário()

#Novos métodos def aumento_salárial(self): self. salário = self. salário ***** Funcionário. Taxa_aumento

#Este método irá sobrescrever o apresentar de pessoa, pois tem o mesma assinatura (nom #Métodos especiais sinalizados por decorators #Chamando o método como um atributo @property def apresentar(self): print(f'''{self. nome}, {self. cargo} salário de R${self. salário}. Taxa de aumento {

#Chamando o método como sendo da classe e não do objeto @classmethod def add_Funcionário(cls): cls. cont_func += 1

@classmethod def classe_Info(cls): print(f'Temos: {cls. cont_func} funcionário(s)') print(f'Aumento salarial de {round(cls. Taxa_aumento - 1, 3)}% ao ano')

#Chamando o método independentemente do objeto @staticmethod def dia_Util(dia): semana = {'Domingo': False , 'Segunda': True , 'Terça': True , 'Quarta': True , 'Quinta': True , 'Sexta': True , 'Sábado': False } #Dicioná

Resultado = semana. get(dia) return Resultado

In [19]: f1 = Funcionário('Arthur', 'Chabole', 21, 1.86, 'feliz', 'engenheiro', 5_000) f2 = Funcionário('Rafael', 'Silveira', 35, 1.75, 'triste', 'Gerente', 7_000)

In [20]: f1. apresentar #Método chamado como um atributo

Temos: 2 funcionário(s) Aumento salarial de 0.05% ao ano Podem ser utizadas com os objetos, mas as informações são as mesmas para todos os objetos.

Temos: 2 funcionário(s) Aumento salarial de 0.05% ao ano None

Temos: 2 funcionário(s) Aumento salarial de 0.05% ao ano None

Métodos com decorator @staticmethod

São métodos independentes do objeto. Usados quando não se alteram nenhum atríbuto da classe ou do objeto, mas podem ser úteis durante a aplicações ou implementações da classe.

True

False

Mais um pouco de herança e comunição entre

as classes

Vamos implementar o seguinte diagrama abaixo onde já temos a classe Pessoa e Funcionário. As classes Vendedores e Gerentes que herdam atributos e métodos da classe Funcionário que por sua vez herdam da classe Pessoa (herança de 2 geração) e Cliente herda somente a classe Pessoa. O simbolo '~' esta sendo usado como conotação para uma variável da classe.

In [21]:^ Funcionário. classe_Info()

In [24]:^ print(f1. classe_Info()) print('----------------') print(f2. classe_Info())

In [41]: Funcionário. dia_Util('Segunda')

Out[41]:

In [25]: Funcionário. dia_Util('Domingo')

Out[25]:

Classe vendedor

Classe Gerente

Criando e utilizando os objetos

def apresentar(self): print(f'{self. nome}, cliente comprou {self. qtd_Compras} produtos vendidos por {sel

In [122… class Vendedor(Funcionário): def init(self, nome, sobrenome, idade, altura, humor, cargo, salário, qtd_Vendas

super(). init(nome, sobrenome, idade, altura, humor, cargo, salário)

self. cargo = 'vendedor' self. qtd_Vendas = qtd_Vendas self. meta = meta

def vender_Produto(self, num_prod): self. qtd_Vendas += num_prod

def apresentar(self): if self. qtd_Vendas >= self. meta: print(f'{self. nome}, {self. cargo} vendeu {self. qtd_Vendas} produtos e bateu a else : print(f'{self. nome}, {self. cargo} vendeu {self. qtd_Vendas} produtos e não bat

In [160… class Gerente(Funcionário): def init(self, nome, sobrenome, idade, altura, humor, cargo, salário, subordinado super(). init(nome, sobrenome, idade, altura, humor, cargo, salário) self. cargo = 'gerente' self. subordinados = subordinados

def contratar(self, Funcionário): self. subordinados. append(Funcionário)

def demitir(self, Funcionário): #Comunicação entre a classe gerente e funcionário self. subordinados. remove(Funcionário)

def apresentar(self): print(f'{self. nome}, {self. cargo} com salário de R${self. salário} ')

print('----------------------------------') print('----- Lista de subordinados ------') print('----------------------------------')

for subordinado in self. subordinados: subordinado. apresentar()

In [163…^ #Instanciando^ os^ objetos #Vendedores v1 = Vendedor('Gabriel', 'Messias', 20, 1.8, 'Neutro', 'Vendedor', 4000, 18, 25) v2 = Vendedor('Maria', 'Alcantara', 20, 1.7, 'Triste', 'Vendedor', 4000, 26, 25) v3 = Vendedor('Rafael', 'Silva', 22, 1.78, 'Feliz', 'Vendedor', 4000, 14, 25) v4 = Vendedor('Guilherme', 'Modesto', 24, 1.65, 'Triste', 'Vendedor', 4000, 28, 25)

#Cliente c1 = Cliente('Thiago', 'Cacique', 24, 1.82, 'Neutro', 5, v1)

#Gerente g1 = Gerente('Arthur', 'Chabole', 21, 1.86,'Feliz', 'Gerente', 5000, [v1, v2])

Apresentando os objetos criados. Cada classe tem seu método apresentar próprio.

Gabriel, vendedor vendeu 18 produtos e não bateu a meta Maria, vendedor vendeu 26 produtos e bateu a meta!!! Rafael, vendedor vendeu 14 produtos e não bateu a meta Guilherme, vendedor vendeu 28 produtos e bateu a meta!!!

Thiago, cliente comprou 5 produtos vendidos por Gabriel

Arthur, gerente com salário de R$

----- Lista de subordinados ------

Gabriel, vendedor vendeu 18 produtos e não bateu a meta Maria, vendedor vendeu 26 produtos e bateu a meta!!!

Explorando herança e modificando os objetos

Cliente herda os atributos e métodos da classe Pessoa

Thiago, cliente comprou 5 produtos vendidos por Gabriel Idade 25 anos Thiago, cliente comprou 6 produtos vendidos por Maria

Vendedor herda os atributos e métodos da classe Funcionário e Funcionário herda

da classe Pessoa.

Gabriel 21 anos com e-mail [email protected] e salário R$4200. Gabriel, vendedor vendeu 18 produtos e não bateu a meta

In [164…^ #Vendedores v1. apresentar() v2. apresentar() v3. apresentar() v4. apresentar()

In [165… #Cliente c1. apresentar()

In [166… #Gerente g1. apresentar()

In [178…^ c1. idade

Out[178…

In [168…^ c1. aniversário() c1. apresentar()

c1. comprar(v2)

print(f'Idade {c1. idade} anos') c1. apresentar()

In [169… v1. idade, v1. salário

Out[169…

In [170…^ v1. aniversário() v1. criar_Email() v1. aumento_salárial()

print(f'{v1. nome} {v1. idade} anos com e-mail {v1. email} e salário R${v1. salário}') v1. apresentar()