From ff61334af7b20de9b94cb24b7d218ba1f4faec13 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 16 Apr 2018 15:13:23 -0300 Subject: [PATCH 01/28] cria classe pessoa --- oo/__init__.py | 0 oo/pessoa.py | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 oo/__init__.py create mode 100644 oo/pessoa.py diff --git a/oo/__init__.py b/oo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/oo/pessoa.py b/oo/pessoa.py new file mode 100644 index 000000000..51d76e740 --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,5 @@ +class Pessoa: # criar seus types personalizados + pass + + + From 6b47cad4ef2361cc4d9bc26f5d20b5ad4df75ab6 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 16 Apr 2018 15:28:56 -0300 Subject: [PATCH 02/28] =?UTF-8?q?criado=20m=C3=A9todo=20cumprimentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 51d76e740..315d8445a 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,5 +1,14 @@ class Pessoa: # criar seus types personalizados - pass + def cumprimentar(self): + return f'Olá {id(self)}' +if __name__ == '__main__': + p = Pessoa() + print(Pessoa.cumprimentar(p)) + print(id(p)) + print(p.cumprimentar()) +##Obs.: método nada mais é que uma função que pertence a uma classe +# portanto, sem estar conectada a um objeto +# From 2524ac194f63453ba1a858c8860027f3298b8549 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 16 Apr 2018 15:33:42 -0300 Subject: [PATCH 03/28] =?UTF-8?q?adicionou=20coment=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 315d8445a..c34c2ab71 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -6,9 +6,8 @@ def cumprimentar(self): p = Pessoa() print(Pessoa.cumprimentar(p)) print(id(p)) - print(p.cumprimentar()) + print(p.cumprimentar()) # executando passando o próprio obj ##Obs.: método nada mais é que uma função que pertence a uma classe # portanto, sem estar conectada a um objeto -# From 198401efc40c824feeb6cbb54acd671709fba8ef Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 16 Apr 2018 15:46:59 -0300 Subject: [PATCH 04/28] =?UTF-8?q?criados=20atributos=20de=20inst=C3=A2ncia?= =?UTF-8?q?=20nome=20e=20idade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index c34c2ab71..a95efc35c 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,13 +1,21 @@ class Pessoa: # criar seus types personalizados + def __init__(self, nome = None, idade = 35): # atributo do objeto + self.idade = idade + self.nome = nome + def cumprimentar(self): return f'Olá {id(self)}' if __name__ == '__main__': - p = Pessoa() + p = Pessoa('Luciano') print(Pessoa.cumprimentar(p)) print(id(p)) print(p.cumprimentar()) # executando passando o próprio obj + print(p.nome) + p.nome = 'Renzo' + print(p.nome) + print(p.idade) + ##Obs.: método nada mais é que uma função que pertence a uma classe # portanto, sem estar conectada a um objeto - From bc0d295c8c3c909dc25fc73b16174a1d7a7193c5 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 18 Apr 2018 19:02:43 -0300 Subject: [PATCH 05/28] =?UTF-8?q?criados=20atributos=20de=20inst=C3=A2ncia?= =?UTF-8?q?=20nome=20e=20idade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index a95efc35c..cfabfc4e2 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,5 +1,5 @@ class Pessoa: # criar seus types personalizados - def __init__(self, nome = None, idade = 35): # atributo do objeto + def __init__(self, nome = None, idade = 35): # atributos de dados self.idade = idade self.nome = nome @@ -18,4 +18,7 @@ def cumprimentar(self): ##Obs.: método nada mais é que uma função que pertence a uma classe -# portanto, sem estar conectada a um objeto +# portanto, sempre está conectada a um objeto + + + From 12e5916bc3023de76caa150a38394ce0d0aa485b Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 18 Apr 2018 19:16:48 -0300 Subject: [PATCH 06/28] criado atributo complexo filhos --- oo/pessoa.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index cfabfc4e2..30148e6ae 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,21 +1,22 @@ class Pessoa: # criar seus types personalizados - def __init__(self, nome = None, idade = 35): # atributos de dados + def __init__(self, *filhos, nome = None, idade = 35): # atributos de dados self.idade = idade self.nome = nome + self.filhos = list(filhos) def cumprimentar(self): return f'Olá {id(self)}' if __name__ == '__main__': - p = Pessoa('Luciano') - print(Pessoa.cumprimentar(p)) - print(id(p)) - print(p.cumprimentar()) # executando passando o próprio obj - print(p.nome) - p.nome = 'Renzo' - print(p.nome) - print(p.idade) - + renzo = Pessoa(nome='Renzo') + luciano = Pessoa(renzo, nome = 'Luciano') + print(Pessoa.cumprimentar(luciano)) + print(id(luciano)) + print(luciano.cumprimentar()) # executando passando o próprio obj + print(luciano.nome) + print(luciano.idade) + for filho in luciano.filhos: + print(filho.nome) ##Obs.: método nada mais é que uma função que pertence a uma classe # portanto, sempre está conectada a um objeto From 6c616b8cf0ca0d998f78a2a33475999bc684e567 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 18 Apr 2018 19:28:24 -0300 Subject: [PATCH 07/28] =?UTF-8?q?criado=20e=20removido=20atributo=20din?= =?UTF-8?q?=C3=A2mico=20de=20objetos=20do=20tipo=20Pessoa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/oo/pessoa.py b/oo/pessoa.py index 30148e6ae..3be3709f9 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -17,9 +17,15 @@ def cumprimentar(self): print(luciano.idade) for filho in luciano.filhos: print(filho.nome) + luciano.sobrenome = 'Ramalho' + print(luciano.sobrenome) + print(luciano.__dict__) + print(renzo.__dict__) #mostra os atributos (criados anteriormente e on the fly) + del luciano.filhos # remove atributos ##Obs.: método nada mais é que uma função que pertence a uma classe # portanto, sempre está conectada a um objeto +##Obs2.: podemos criar atributos on the fly para aquele objeto específico(não é boa pratica) From b77a7d6167fc9dc756f045057ea2706df46343c1 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 18 Apr 2018 19:40:47 -0300 Subject: [PATCH 08/28] criado atributo de classe olhos --- oo/pessoa.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/oo/pessoa.py b/oo/pessoa.py index 3be3709f9..b147114d7 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,4 +1,6 @@ class Pessoa: # criar seus types personalizados + olhos = 2 # atributo default ou de classe + def __init__(self, *filhos, nome = None, idade = 35): # atributos de dados self.idade = idade self.nome = nome @@ -21,7 +23,15 @@ def cumprimentar(self): print(luciano.sobrenome) print(luciano.__dict__) print(renzo.__dict__) #mostra os atributos (criados anteriormente e on the fly) + Pessoa.olhos = 3 del luciano.filhos # remove atributos + luciano.olhos = 1 + del luciano.olhos + print(Pessoa.olhos) # faz sentido porque é um default atributo de classe + print(luciano.olhos) + print(renzo.olhos) + print(id(Pessoa.olhos), id(luciano.olhos), id(renzo.olhos)) # sao iguais + ##Obs.: método nada mais é que uma função que pertence a uma classe # portanto, sempre está conectada a um objeto From a7d545ed0bac3df4822464f2f6c625090a490bbf Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Fri, 20 Apr 2018 09:46:54 -0300 Subject: [PATCH 09/28] class method --- oo/pessoa.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index b147114d7..724f4c2fc 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -9,10 +9,21 @@ def __init__(self, *filhos, nome = None, idade = 35): # atributos de dados def cumprimentar(self): return f'Olá {id(self)}' + @staticmethod + def metodo_estatico(): + return 42 #fazer algum cálculo que independa da classe e objeto se nao for no + # metodo estatico + + @classmethod + def nome_e_atributos_de_classe(cls): # usado para acessar dados da propria classe + return f'{cls} - olhos {cls.olhos}' + + + if __name__ == '__main__': renzo = Pessoa(nome='Renzo') luciano = Pessoa(renzo, nome = 'Luciano') - print(Pessoa.cumprimentar(luciano)) + print(Pessoa.cumprimentar(luciano)) # obrigado a passar o objeto print(id(luciano)) print(luciano.cumprimentar()) # executando passando o próprio obj print(luciano.nome) @@ -31,6 +42,14 @@ def cumprimentar(self): print(luciano.olhos) print(renzo.olhos) print(id(Pessoa.olhos), id(luciano.olhos), id(renzo.olhos)) # sao iguais + print(Pessoa.metodo_estatico(), luciano.metodo_estatico()) # sem o obj dentro(1 arg pq e e estat) ou atraves do obj + # se o atributo nao for encontrado no obj, + # o python procura na classe(2 arg) + print(Pessoa.nome_e_atributos_de_classe(), luciano.nome_e_atributos_de_classe()) + # pode ser executado pela classe ou pelo objeto + + + ##Obs.: método nada mais é que uma função que pertence a uma classe From cb3f8a434b25595c75e14b71c41663e587f4d8b1 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Fri, 20 Apr 2018 16:41:12 -0300 Subject: [PATCH 10/28] =?UTF-8?q?cria=C3=A7=C3=A3o=20da=20classe=20compost?= =?UTF-8?q?a=20carro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/carro.py | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 oo/carro.py diff --git a/oo/carro.py b/oo/carro.py new file mode 100644 index 000000000..14d12a2bb --- /dev/null +++ b/oo/carro.py @@ -0,0 +1,156 @@ +""""Você deve criar uma classe carro que vai possuir dois +atributos compostos por outras duas classes: + +1)Motor +2)Direção + +O motor terá a responsabilidade de controlar a velocidade. +Ele oferece os seguintes atributos: +1) Atributo de dado, velocidade +2) Método acelerar, que deverá incrementar a velocidade de +uma unidade +3) Método frear que deverá decrementar a velocidade em duas +unidades + +A direção terá a responsabilidade de controlar a direção. +Ela oferece os seguintes atributos: + +1) Valor de direção com valores possíveis: Norte, Sul, Leste e Oeste +2) Método girar_a_direita +3) Método girar_a_esquerda + + N +O L + S + +Exemplo: +>>> motor = Motor() +>>> motor.velocidade +0 +>>> motor.acelerar() +>>> motor.velocidade +1 +>>> motor.acelerar() +>>> motor.velocidade +2 +>>> motor.acelerar() +>>> motor.velocidade +3 +>>> motor.frear() +>>> motor.velocidade +1 +>>> motor.frear() +>>> motor.velocidade +0 +>>> direcao = Direcao() +>>> direcao.valor +'Norte' +>>> direcao.girar_a_direita() +>>> direcao.valor +'Leste' +>>> direcao.girar_a_direita() +>>> direcao.valor +'Sul' +>>> direcao.girar_a_direita() +>>> direcao.valor +'Oeste' +>>> direcao.girar_a_direita() +>>> direcao.valor +'Norte' +>>> direcao.girar_a_esquerda() +>>> direcao.valor +'Oeste' +>>> direcao.girar_a_esquerda() +>>> direcao.valor +'Sul' +>>> carro = Carro(direcao, motor) +>>> carro.calcular_velocidade() +0 +>>> carro.acelerar() +>>> carro.calcular_velocidade() +1 +>>> carro.frear() +>>> carro.calcular_velocidade() +0 +>>> carro.calcular_direcao() +'Sul' +>>> carro.girar_a_direita() +>>> carro.calcular_direcao() +'Oeste' +>>> carro.girar_a_esquerda() +>>> carro.calcular_direcao() +'Sul' +""" + +class Carro: + def __init__(self, direcao, motor): + self.direcao = direcao + self.motor = motor + + def calcular_velocidade(self): + return self.motor.velocidade + + def acelerar(self): + self.motor.acelerar() + + def frear(self): + self.motor.frear() + + def calcular_direcao(self): + return self.direcao.valor + + def girar_a_direita(self): + self.direcao.girar_a_direita() + + def girar_a_esquerda(self): + self.direcao.girar_a_esquerda() + +NORTE = 'Norte' +SUL = 'Sul' +LESTE = 'Leste' +OESTE = 'Oeste' + + +class Motor: + def __init__(self, velocidade = 0): + self.velocidade = velocidade + + + def acelerar(self): + self.velocidade += 1 + + def frear(self): + self.velocidade -= 2 + self.velocidade = max(0, self.velocidade) + + +class Direcao: + rotacao_a_direita_dct={ + NORTE: LESTE, LESTE: SUL, SUL: OESTE, OESTE:NORTE + } + rotacao_a_esquerda_dct={ + NORTE: OESTE, OESTE: SUL, SUL: LESTE, LESTE: NORTE + } + + + def __init__(self): + self.valor = NORTE + + def girar_a_direita(self): + self.valor = self.rotacao_a_direita_dct[self.valor] + + def girar_a_esquerda(self): + self.valor = self.rotacao_a_esquerda_dct[self.valor] + + + + + + + + + + + + + From a7ac6046bedf24f56603e48466b1741526f911c3 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Fri, 20 Apr 2018 16:56:39 -0300 Subject: [PATCH 11/28] implementando obstaculos, porcos e passaros --- fase.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fase.py b/fase.py index 3385175c6..1c8fd161f 100644 --- a/fase.py +++ b/fase.py @@ -43,7 +43,7 @@ def adicionar_obstaculo(self, *obstaculos): :param obstaculos: """ - pass + self._obstaculos.extend(obstaculos) def adicionar_porco(self, *porcos): """ @@ -51,7 +51,7 @@ def adicionar_porco(self, *porcos): :param porcos: """ - pass + self._porcos.extend(porcos) def adicionar_passaro(self, *passaros): """ @@ -59,7 +59,7 @@ def adicionar_passaro(self, *passaros): :param passaros: """ - pass + self._passaros.extend(passaros) def status(self): """ From d86c0686396fe72c4383aad0e3da15bd44826fa2 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 10:03:13 -0300 Subject: [PATCH 12/28] criacao da classe pessoa --- oo/pessoa.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 724f4c2fc..a71b95027 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -18,10 +18,12 @@ def metodo_estatico(): def nome_e_atributos_de_classe(cls): # usado para acessar dados da propria classe return f'{cls} - olhos {cls.olhos}' +class Homem(Pessoa): + pass if __name__ == '__main__': - renzo = Pessoa(nome='Renzo') + renzo = Homem(nome='Renzo') # podemos mudar para homem e continuamos a obter o mesmo result, pq homem herdou de pessoa luciano = Pessoa(renzo, nome = 'Luciano') print(Pessoa.cumprimentar(luciano)) # obrigado a passar o objeto print(id(luciano)) @@ -48,7 +50,11 @@ def nome_e_atributos_de_classe(cls): # usado para acessar dados da propria clas print(Pessoa.nome_e_atributos_de_classe(), luciano.nome_e_atributos_de_classe()) # pode ser executado pela classe ou pelo objeto - + pessoa = Pessoa('Anonimo') + print(isinstance(pessoa, Pessoa)) + print(isinstance(pessoa, Homem)) + print(isinstance(renzo, Homem)) + print(isinstance(renzo, Pessoa)) From e3076a26f18e0b7be0e38c6dea34ace7969c782d Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 10:22:19 -0300 Subject: [PATCH 13/28] renomeando testes e criando test_carro --- oo/test_carro.py | 24 +++++++++++++++++++ testes/{atores_testes.py => testes_atores.py} | 0 testes/{fase_testes.py => testes_fase.py} | 0 .../{integracao.py => testes_integracao.py} | 0 4 files changed, 24 insertions(+) create mode 100644 oo/test_carro.py rename testes/{atores_testes.py => testes_atores.py} (100%) rename testes/{fase_testes.py => testes_fase.py} (100%) rename testes/{integracao.py => testes_integracao.py} (100%) diff --git a/oo/test_carro.py b/oo/test_carro.py new file mode 100644 index 000000000..7b9df25e8 --- /dev/null +++ b/oo/test_carro.py @@ -0,0 +1,24 @@ +from unittest import TestCase +from oo.carro import Motor + +class CarroTestCase(TestCase): + def teste_velocidade_inicial(self): # herdar da test case e comecar o teste com o prefixo test + motor = Motor() + self.assertEqual(0, motor.velocidade) + + def teste_acelerar(self): + motor = Motor() + motor.acelerar() + self.assertEqual(1, motor.velocidade) + + + + + + + + + + + + diff --git a/testes/atores_testes.py b/testes/testes_atores.py similarity index 100% rename from testes/atores_testes.py rename to testes/testes_atores.py diff --git a/testes/fase_testes.py b/testes/testes_fase.py similarity index 100% rename from testes/fase_testes.py rename to testes/testes_fase.py diff --git a/testes/integracao.py b/testes/testes_integracao.py similarity index 100% rename from testes/integracao.py rename to testes/testes_integracao.py From e903551866ddd84aff59907c27e3cb7e4e8d6cf8 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 13:11:30 -0300 Subject: [PATCH 14/28] sobrescrita de atributo de passaro vermelho, obstaculo e porco em atores. Mutacao no pessoa --- atores.py | 6 +++--- oo/pessoa.py | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/atores.py b/atores.py index cfc2ef5ea..ce983a50b 100644 --- a/atores.py +++ b/atores.py @@ -57,11 +57,11 @@ def colidir(self, outro_ator, intervalo=1): class Obstaculo(Ator): - pass + _caracter_ativo = 'O' class Porco(Ator): - pass + _caracter_ativo = '@' class DuploLancamentoExcecao(Exception): @@ -137,4 +137,4 @@ class PassaroAmarelo(Passaro): class PassaroVermelho(Passaro): - pass \ No newline at end of file + _caracter_ativo = 'V' \ No newline at end of file diff --git a/oo/pessoa.py b/oo/pessoa.py index a71b95027..5c7cac75c 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -21,9 +21,12 @@ def nome_e_atributos_de_classe(cls): # usado para acessar dados da propria clas class Homem(Pessoa): pass +class Mutante(Pessoa): + olhos = 3 + #sobrescrita de atributo de dados if __name__ == '__main__': - renzo = Homem(nome='Renzo') # podemos mudar para homem e continuamos a obter o mesmo result, pq homem herdou de pessoa + renzo = Mutante(nome='Renzo') # podemos mudar para homem e continuamos a obter o mesmo result, pq homem herdou de pessoa luciano = Pessoa(renzo, nome = 'Luciano') print(Pessoa.cumprimentar(luciano)) # obrigado a passar o objeto print(id(luciano)) @@ -36,7 +39,6 @@ class Homem(Pessoa): print(luciano.sobrenome) print(luciano.__dict__) print(renzo.__dict__) #mostra os atributos (criados anteriormente e on the fly) - Pessoa.olhos = 3 del luciano.filhos # remove atributos luciano.olhos = 1 del luciano.olhos @@ -55,6 +57,9 @@ class Homem(Pessoa): print(isinstance(pessoa, Homem)) print(isinstance(renzo, Homem)) print(isinstance(renzo, Pessoa)) + print(renzo.olhos) +# quando uma classe nao herda de nenhuma outra, ela herda implicitamente da classe raiz object +# e a busca vai pesquisar se há o atributo no object se nao encontrar em nenhuma From 545b3aeb63c255c32ccae2c0042e8caab674724b Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 15:39:58 -0300 Subject: [PATCH 15/28] =?UTF-8?q?sobrescri=C3=A7=C3=A3o=20de=20m=C3=A9todo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 5c7cac75c..dbcfdcf6d 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -7,7 +7,7 @@ def __init__(self, *filhos, nome = None, idade = 35): # atributos de dados self.filhos = list(filhos) def cumprimentar(self): - return f'Olá {id(self)}' + return f'Olá, meu nome é {self.nome}' @staticmethod def metodo_estatico(): @@ -19,15 +19,17 @@ def nome_e_atributos_de_classe(cls): # usado para acessar dados da propria clas return f'{cls} - olhos {cls.olhos}' class Homem(Pessoa): - pass - + def cumprimentar(self): + cumprimentar_da_classe = super().cumprimentar() + return f'{cumprimentar_da_classe}. Aperto de mão' +# super() vai chamar os elementos da classe pai class Mutante(Pessoa): olhos = 3 #sobrescrita de atributo de dados if __name__ == '__main__': renzo = Mutante(nome='Renzo') # podemos mudar para homem e continuamos a obter o mesmo result, pq homem herdou de pessoa - luciano = Pessoa(renzo, nome = 'Luciano') + luciano = Homem(renzo, nome = 'Luciano') print(Pessoa.cumprimentar(luciano)) # obrigado a passar o objeto print(id(luciano)) print(luciano.cumprimentar()) # executando passando o próprio obj @@ -60,7 +62,8 @@ class Mutante(Pessoa): print(renzo.olhos) # quando uma classe nao herda de nenhuma outra, ela herda implicitamente da classe raiz object # e a busca vai pesquisar se há o atributo no object se nao encontrar em nenhuma - + print(luciano.cumprimentar()) + print(renzo.cumprimentar()) ##Obs.: método nada mais é que uma função que pertence a uma classe From b4865bc6eb7ad19c7dada8239d2559c00cb89c9a Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 16:11:26 -0300 Subject: [PATCH 16/28] adicionando comentario em teste_acabou_com_porcos_e_passaros --- testes/testes_fase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testes/testes_fase.py b/testes/testes_fase.py index 8158a43f5..60503ce4c 100644 --- a/testes/testes_fase.py +++ b/testes/testes_fase.py @@ -106,7 +106,7 @@ def teste_acabou_sem_porcos(self): def teste_acabou_com_porcos_e_passaros(self): fase = Fase() - porcos = [PorcoFake(1, 1) for _ in range(2)] # criando 2 porcos + porcos = [PorcoFake(1, 1) for _ in range(2)] # criando 2 porcos # o _ significa que s variavel que estamos iterando nao sera utilizada passaros = [PassaroFake(1, 1) for _ in range(2)] # criando 2 pássaros fase.adicionar_porco(*porcos) fase.adicionar_passaro(*passaros) From dc4a8a9e306aa32ea9c3ac94a04ebf87a4c7f5f7 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 16:31:07 -0300 Subject: [PATCH 17/28] teste de fase --- fase.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/fase.py b/fase.py index 1c8fd161f..07779fe1c 100644 --- a/fase.py +++ b/fase.py @@ -73,7 +73,15 @@ def status(self): :return: """ - return EM_ANDAMENTO + if not self._possui_porco_ativo(): + return VITORIA +# quando o metodo(pode ser tb com atributo de classe) comeca com _ é um metodo protegido, apenas a própria classe +# ou algumas de suas subclasses podem fazer uso dele + elif self._possui_passaros_ativos(): + return EM_ANDAMENTO + else: + return DERROTA + def lancar(self, angulo, tempo): """ @@ -105,3 +113,19 @@ def calcular_pontos(self, tempo): def _transformar_em_ponto(self, ator): return Ponto(ator.x, ator.y, ator.caracter()) + def _possui_porco_ativo(self): + for porco in self._porcos: + if porco.status== ATIVO: + return True + + return False + + def _possui_passaros_ativos(self): + for passaro in self._passaros: + if passaro.status== ATIVO: + return True + + return False + + + From 984ad04fdc5915018bb1c0602d1ae62897af4abc Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 17:06:49 -0300 Subject: [PATCH 18/28] =?UTF-8?q?em=20lancar=20adicionamos=20o=20lan=C3=A7?= =?UTF-8?q?ar=20passaro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fase.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fase.py b/fase.py index 07779fe1c..f4352c214 100644 --- a/fase.py +++ b/fase.py @@ -94,7 +94,10 @@ def lancar(self, angulo, tempo): :param angulo: ângulo de lançamento :param tempo: Tempo de lançamento """ - pass + for passaro in self._passaros: + if not passaro.foi_lancado(): + passaro.lancar(angulo, tempo) + break def calcular_pontos(self, tempo): From 58f9efb0e032a674379bfc04a12262b7774642f2 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 17:29:08 -0300 Subject: [PATCH 19/28] colidir com o chao --- fase.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fase.py b/fase.py index f4352c214..ace32c02d 100644 --- a/fase.py +++ b/fase.py @@ -109,6 +109,11 @@ def calcular_pontos(self, tempo): :param tempo: tempo para o qual devem ser calculados os pontos :return: objeto do tipo Ponto """ + for passaro in self._passaros: + passaro.calcular_posicao(tempo) + for alvo in self._obstaculos+self._porcos: + passaro.colidir(alvo, self.intervalo_de_colisao) + passaro.colidir_com_chao() pontos=[self._transformar_em_ponto(a) for a in self._passaros+self._obstaculos+self._porcos] return pontos From 041fe076fca6f9e8b1b909d06062951822b7a94d Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Mon, 23 Apr 2018 17:37:01 -0300 Subject: [PATCH 20/28] calcular posicao para self.x e self.y, posicao do ator --- atores.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atores.py b/atores.py index ce983a50b..e5b0b64e6 100644 --- a/atores.py +++ b/atores.py @@ -9,7 +9,7 @@ GRAVIDADE = 10 # m/s^2 -class Ator(): +class Ator: """ Classe que representa um ator. Ele representa um ponto cartesiano na tela. """ @@ -38,7 +38,7 @@ def calcular_posicao(self, tempo): :param tempo: o tempo do jogo :return: posição x, y do ator """ - return 1, 1 + return self.x, self.y def colidir(self, outro_ator, intervalo=1): """ From 2f6c0ef0621bf6fefc1fbcde2cc13c281f8c477f Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Tue, 24 Apr 2018 16:30:05 -0300 Subject: [PATCH 21/28] metodo colidir --- testes/testes_atores.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testes/testes_atores.py b/testes/testes_atores.py index f4254f29e..6385ce5f7 100644 --- a/testes/testes_atores.py +++ b/testes/testes_atores.py @@ -113,7 +113,7 @@ def test_caracter(self): def assert_colisao_atores_ativos(self, ator, ator2, intervalo=1): """ Se certifica que há colisão entre atores ativos - Atenção: Esse não é método de teste porque nao se inicia com prefixo "text". + Atenção: Esse não é método de teste porque nao se inicia com prefixo "tes t". Ele serve apenas para encapsular toda lógica de teste de colisão entre dois atores ativos """ # Conferindo status dos dois atores antes da colisão From 2df363fb13ba404d9aaec620d3df4018c1fcdc2a Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Tue, 24 Apr 2018 16:30:58 -0300 Subject: [PATCH 22/28] metodo colidir --- atores.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/atores.py b/atores.py index e5b0b64e6..9f6689ff7 100644 --- a/atores.py +++ b/atores.py @@ -52,7 +52,12 @@ def colidir(self, outro_ator, intervalo=1): :param intervalo: Intervalo a ser considerado :return: """ - pass + if self.status == ATIVO and outro_ator.status == ATIVO: + delta_x =abs(self.x - outro_ator.x) + delta_y =abs(self.y - outro_ator.y) + if delta_x <= intervalo and delta_y <= intervalo: + self.status = outro_ator.status=DESTRUIDO + From d2097a423a6f258b14267067f1c275d330d2844d Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 08:31:24 -0300 Subject: [PATCH 23/28] caracter destruido --- atores.py | 1 + 1 file changed, 1 insertion(+) diff --git a/atores.py b/atores.py index 9f6689ff7..ab8036784 100644 --- a/atores.py +++ b/atores.py @@ -67,6 +67,7 @@ class Obstaculo(Ator): class Porco(Ator): _caracter_ativo = '@' + _caracter_destruido = '+' class DuploLancamentoExcecao(Exception): From 5d367b0b19dfff41f09e1fbf1b6b3e9c5e674a85 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 08:37:43 -0300 Subject: [PATCH 24/28] classe passaro vermelho caracter destruido e velocidade escalar --- atores.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atores.py b/atores.py index ab8036784..499d37f5c 100644 --- a/atores.py +++ b/atores.py @@ -143,4 +143,6 @@ class PassaroAmarelo(Passaro): class PassaroVermelho(Passaro): - _caracter_ativo = 'V' \ No newline at end of file + _caracter_ativo = 'V' + _caracter_destruido = 'v' + velocidade_escalar = 20 \ No newline at end of file From 929fdcfe3c3567681069271ac0deb7d86f801f3b Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 08:45:27 -0300 Subject: [PATCH 25/28] =?UTF-8?q?metodo=20foi=20lan=C3=A7ado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/atores.py b/atores.py index 499d37f5c..ad0096dd1 100644 --- a/atores.py +++ b/atores.py @@ -99,7 +99,7 @@ def foi_lancado(self): :return: booleano """ - return True + return not self._tempo_de_lancamento is None def colidir_com_chao(self): """ @@ -135,7 +135,9 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ - pass + self._angulo_de_lancamento = angulo + self._tempo_de_lancamento = tempo_de_lancamento + class PassaroAmarelo(Passaro): From b928394b254916d142532d2e0735831e357c9ba4 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 09:20:02 -0300 Subject: [PATCH 26/28] lancamento vertical --- atores.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/atores.py b/atores.py index ad0096dd1..aa90ea4b7 100644 --- a/atores.py +++ b/atores.py @@ -123,7 +123,10 @@ def calcular_posicao(self, tempo): :param tempo: tempo de jogo a ser calculada a posição :return: posição x, y """ - return 1, 1 + if self.foi_lancado(): + delta_t = tempo - self._tempo_de_lancamento + self._calcular_posicao_vertical(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): @@ -138,10 +141,18 @@ def lancar(self, angulo, tempo_de_lancamento): self._angulo_de_lancamento = angulo self._tempo_de_lancamento = tempo_de_lancamento + def _calcular_posicao_vertical(self, delta_t): + y_atual = self._y_inicial + angulo_radianos = math.radians(self._angulo_de_lancamento) + y_atual += self.velocidade_escalar*delta_t*math.sin(angulo_radianos) + y_atual -= (GRAVIDADE * delta_t**2)/2 + self.y = y_atual class PassaroAmarelo(Passaro): - pass + _caracter_ativo = 'A' + _caracter_destruido = 'a' + velocidade_escalar = 30 class PassaroVermelho(Passaro): From 6120028a8066fcea14b6efbf9fe746df5e549376 Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 09:40:54 -0300 Subject: [PATCH 27/28] lancamento horizontal --- atores.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/atores.py b/atores.py index aa90ea4b7..4755d13d1 100644 --- a/atores.py +++ b/atores.py @@ -126,6 +126,7 @@ def calcular_posicao(self, tempo): if self.foi_lancado(): delta_t = tempo - self._tempo_de_lancamento self._calcular_posicao_vertical(delta_t) + self._calcular_posicao_horizontal(delta_t) return super().calcular_posicao(tempo) @@ -148,6 +149,12 @@ def _calcular_posicao_vertical(self, delta_t): y_atual -= (GRAVIDADE * delta_t**2)/2 self.y = y_atual + def _calcular_posicao_horizontal(self, delta_t): + x_atual = self._x_inicial + angulo_radianos = math.radians(self._angulo_de_lancamento) + x_atual += self.velocidade_escalar * delta_t * math.cos(angulo_radianos) + self.x = x_atual + class PassaroAmarelo(Passaro): _caracter_ativo = 'A' From 08f8d9b5d94879ceee762dc2f6087ed7bd165bcb Mon Sep 17 00:00:00 2001 From: Gerson Neto Date: Wed, 25 Apr 2018 09:52:39 -0300 Subject: [PATCH 28/28] colisao com o chao --- atores.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/atores.py b/atores.py index 4755d13d1..90cacc039 100644 --- a/atores.py +++ b/atores.py @@ -107,7 +107,9 @@ def colidir_com_chao(self): o status dos Passaro deve ser alterado para destruido, bem como o seu caracter """ - pass + if self.y <=0: + self.status = DESTRUIDO + def calcular_posicao(self, tempo): """ @@ -123,7 +125,7 @@ def calcular_posicao(self, tempo): :param tempo: tempo de jogo a ser calculada a posição :return: posição x, y """ - if self.foi_lancado(): + if self._esta_voando(): delta_t = tempo - self._tempo_de_lancamento self._calcular_posicao_vertical(delta_t) self._calcular_posicao_horizontal(delta_t) @@ -139,22 +141,26 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ - self._angulo_de_lancamento = angulo + self._angulo_de_lancamento = math.radians(angulo) self._tempo_de_lancamento = tempo_de_lancamento def _calcular_posicao_vertical(self, delta_t): y_atual = self._y_inicial - angulo_radianos = math.radians(self._angulo_de_lancamento) + angulo_radianos = self._angulo_de_lancamento y_atual += self.velocidade_escalar*delta_t*math.sin(angulo_radianos) y_atual -= (GRAVIDADE * delta_t**2)/2 self.y = y_atual def _calcular_posicao_horizontal(self, delta_t): x_atual = self._x_inicial - angulo_radianos = math.radians(self._angulo_de_lancamento) + angulo_radianos = self._angulo_de_lancamento x_atual += self.velocidade_escalar * delta_t * math.cos(angulo_radianos) self.x = x_atual + def _esta_voando(self): + return self.foi_lancado() and self.status == ATIVO + + class PassaroAmarelo(Passaro): _caracter_ativo = 'A'