diff --git a/oo/__init__.py b/oo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/oo/carro.py b/oo/carro.py new file mode 100644 index 000000000..bf1bbb147 --- /dev/null +++ b/oo/carro.py @@ -0,0 +1,207 @@ +""" +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, Oeste +2) Método girar_a_direita +3) Método girar_a_esquerda + N +O L + S + + Exemplo: + >>> # Testando o Motor + >>> 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 + >>> # Testando Direcao + >>> 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' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Leste' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Norte' + >>> carro = Carro(direcao, motor) + >>> carro.calcular_velocidade() + 0 + >>> carro.acelerar() + >>> carro.calcular_velocidade() + 1 + >>> carro.acelerar() + >>> carro.calcular_velocidade() + 2 + >>> carro.frear() + >>> carro.calcular_velocidade() + 0 + >>> carro.calcular_direcao() + 'Norte' + >>> carro.girar_a_direita() + >>> carro.calcular_direcao() + 'Leste' + >>> carro.girar_a_esquerda() + >>> carro.calcular_direcao() + 'Norte' + >>> carro.girar_a_esquerda() + >>> carro.calcular_direcao() + 'Oeste' +""" + +class Motor: + def __init__(self): + self.velocidade = 0 + + def acelerar(self): + self.velocidade += 1 + + def frear(self): + #if self.velocidade < 2: + # self.velocidade = 0 + #else: + # self.velocidade -= 2 + self.velocidade -= 2 + self.velocidade = max(0, self.velocidade) + +class Direcao: + direcao = ('Norte', 'Leste', 'Sul', 'Oeste') + + def __init__(self): + self.valor = Direcao.direcao[0] + + def girar_a_direita(self): + if self.valor == 'Oeste': + self.valor = Direcao.direcao[0] + else: + self.valor = Direcao.direcao[Direcao.direcao.index(self.valor)+1] + + def girar_a_esquerda(self): + if self.valor == 'Norte': + self.valor = Direcao.direcao[3] + else: + self.valor = Direcao.direcao[Direcao.direcao.index(self.valor)-1] + + def calcular_direcao(self): + return direcao[self.valor] + + +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() + + +if __name__ == '__main__': + # Testando o motor + motor = Motor() + print(motor.velocidade) + motor.acelerar() + print(motor.velocidade) + motor.acelerar() + print(motor.velocidade) + motor.acelerar() + print(motor.velocidade) + motor.frear() + print(motor.velocidade) + motor.frear() + print(motor.velocidade) + + # Testando a direção + direcao = Direcao() + print(direcao.valor) + direcao.girar_a_direita() + print(direcao.valor) + direcao.girar_a_direita() + print(direcao.valor) + direcao.girar_a_direita() + print(direcao.valor) + direcao.girar_a_direita() + print(direcao.valor) + + direcao.girar_a_esquerda() + print(direcao.valor) + direcao.girar_a_esquerda() + print(direcao.valor) + direcao.girar_a_esquerda() + print(direcao.valor) + direcao.girar_a_esquerda() + print(direcao.valor) + + #t Testando o carro + carro = Carro(direcao, motor) + print(carro.calcular_velocidade()) + carro.acelerar() + print(carro.calcular_velocidade()) + carro.acelerar() + print(carro.calcular_velocidade()) + carro.frear() + print(carro.calcular_velocidade()) + print(carro.calcular_direcao()) + carro.girar_a_direita() + print(carro.calcular_direcao()) + carro.girar_a_esquerda() + print(carro.calcular_direcao()) + carro.girar_a_esquerda() + print(carro.calcular_direcao()) diff --git a/oo/pessoa.py b/oo/pessoa.py new file mode 100644 index 000000000..920d49dac --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,58 @@ +class Pessoa: + # atributo de class + olhos = 2 + + # atributos de instância + # função dunder init __init__ (para inicialização dos atributo de instância) + def __init__(self, *filhos, nome=None, idade=35): + self.idade = idade + self.nome = nome + self.filhos = list(filhos) + + def comprimentar(self): + return f'Olá {id(self)}' + + # metodo estatico com uso do decorator @staticmethod + @staticmethod + def metodo_estatico(): + return 42 + + # metodo de class com uso de decorator @classmethod + @classmethod + def nome_e_atributos_de_classe(cls): + return f'{cls} - olhos {cls.olhos}' + +if __name__ == '__main__': + jordan = Pessoa(nome='Jordan', idade=12) + harold = Pessoa(jordan, nome='Harold', idade=50) + print(Pessoa.comprimentar(harold)) + print(id(harold)) + print(harold.comprimentar()) + print(harold.nome) + print((harold.idade)) + for filho in harold.filhos: + print(filho.nome) + # Criar atributos dinãmico + harold.sobrenome = 'Gautschi' + # Apagar um atributo + del jordan.filhos + # Mostrar os atributos de instancia objeto.__dict__ + print(harold.__dict__) + print(jordan.__dict__) + # chamar atributo de class + print(Pessoa.olhos) + # modificando o atributo de class, ele passa a ser um atributo do objeto + harold.olhos = 1 + # acesso no atributo de class pelo objeto + print(harold.olhos) + print(jordan.olhos) + print(id(Pessoa.olhos), id(harold.olhos), id(jordan.olhos)) + print(harold.__dict__) + print(jordan.__dict__) + # chamar do metodo estatico pela class ou pelo objeto + print(Pessoa.metodo_estatico(), harold.metodo_estatico()) + # chamar do metodo de class pela class ou pelo objeto + print(Pessoa.nome_e_atributos_de_classe(), harold.nome_e_atributos_de_classe()) + + +