Vamos continuar agora aprendendo mais sobre programação orientada a objetos. Então, na aula anterior, nós vimos que existe conceito de classes e uma classe pode ter várias instâncias, vários objetos. Esses objetos vão ter atributos, que são variáveis que armazenam valores. E, também, a gente vai ter métodos, vamos ver como é que a gente cria métodos. Mas, antes disso, vamos dar uma olhada nesse conceito que a gente chama de construtor, que é método especial. É método da classe, mas ele é método que tem esse nome especial, que é esse sublinhado, sublinhado, 'init', depois duas vezes aquele caractere de 'underscore', sublinhado duas vezes. Esse 'init' é chamado de construtor da classe. E ele vai ser chamado, automaticamente, pelo interpretador quando os objetos são criados, ou seja, quando as classes são instanciadas. E ele nos dá a oportunidade de passar como parâmetro o valor dos atributos, inicialmente, e ele já define o valor desses atributos. Então, nessa classe, carro, seria algo desse tipo aqui. Então, eu vou experimentar aqui, a gente digitar no 'Idle'. Por exemplo, isso aqui. Seria algo desse tipo. Então, o que aconteceu aqui? Eu estou definindo uma classe 'carro'. E a classe carro vai ter método, que é esse método 'init'; underscore, underscore, init, underscore, underscore. E daí, ele recebe, como parâmetro, algumas coisas. A primeira coisa é o nome de uma variável que vai representar o próprio objeto. Então, por isso, às vezes, a gente chama ele de 'self', porque ele representa o próprio objeto. Esse 'self' aqui. E o próprio interpretador que vai passar como parâmetro valor que, na verdade, vai ser endereço de memória onde esse objeto vai estar guardado. Então, a gente não precisa se preocupar com isso. A gente simplesmente lembra que no init, sempre, a primeira variável é self. E, depois, os atributos que a gente quer. Então, por exemplo, eu quero três atributos: o modelo, o ano e a cor do carro. E daí? Aqui tem a implementação. Essas três linhas são o código que implementa o método init. O que essas três linhas estão dizendo? Elas estão dizendo que, primeiro, eu quero o modelo que é passado como parâmetro, eu quero que você armazene como atributo de mim mesmo, do objeto que eu estou criando. Então, 'self', ponto, modelo aqui. Recebe o modelo, pega esse modelo que é passado como parâmetro, cria atributo chamado modelo e armazena esse valor nesse modelo. A mesma coisa com o ano e com a cor. Então, ele está criando três atributos e atribuindo o que passou como parâmetro. E daí como a gente usa esse INIT? Se eu quero dizer que o carro do meu avô. Eu faço carro e, entre parenteses, eu coloco o valor dos três atributos. O próprio 'Idle' já mostrou para mim que eu tenho que passar o modelo, o ano e a cor. Então eu vou passar o modelo. Vamos supor que fosse uma Ferrari. O ano, não sei que ano era. 1980 que a Ferrari estava bem. E a cor, obviamente, é vermelha. E daí, se eu pegar o carro do meu avô, ponto, cor. O que eu errei aqui? Eu digitei errado. Carro do meu avô, ponto, cor, é vermelho. Então, a gente quase sempre vai ter esse método init que vai ser o construtor onde a gente define os valores iniciais dos parâmetros. Vamos continuar para nos aprofundarmos pouco mais disso. Eu vou carregar aqui programa pouquinho mais longo, que eu digitei anteriormente. Ele se chama 'carro, ponto, py'. E ele faz uma série de brincadeirinhas com dois tipos de carros. Então, aqui eu tenho a definição da classe carro aqui embaixo. E tenho o método 'init' e depois ele tem mais dois métodos. Tem o método imprima, o método acelere e o método pare. E no final aqui, ele executa esse função 'main', onde a função main a gente vê aqui. Está definida aqui a função main. O que faz a função main? É uma função que está fora da classe, ela é simplesmente teste para exercitar essa classe. Então, ela cria dois carros. Ela faz carro 1 recebe carro, passando como parâmetro: Brasília, 1968, amarela, 80. O que é 80? 80 vai ser aqui o último atributo que é a velocidade máxima. Então, diz que essa brasília consegue colocar na última marcha e acelerar o máximo, ela chega a 80km por hora. Já esse carro 2 aqui é fuscão, preto, de 1981. Ele consegue atingir a incrível marca de 95km por hora, se você estiver na descida. E daí? Eu chamo, então, criou aqui duas instâncias da classe carro, guardando nas variáveis carro 1 e carro 2. E agora, eu chamo alguns métodos nesses carros. Então, eu faço carro 1 acelera até 40km por hora, carro 2 acelera até 50km. Carro 1 acelera até 80km. Carro 1, pare! Carro 2 acelera até 100km por hora. E vamos o que fazem esses métodos. Então, primeiro tem o construtor. Como está o construtor aqui? Sempre começa com 'self'. E depois, aqui, ele colocou nomes muito curtinhos nesses parâmetros. Na verdade, eu até não gosto muito, eu acho que o nome das variáveis tem que ser mais explicativas. Depois a gente poderia mudar isso aqui. Eu preferia usar o próprio modelo ano, cor e velocidade máxima. Anote que o velocidade aqui não é passado como parâmetro. Então, o 'm', ele guarda no modelo; o 'a', ele guarda no ano; o 'c', ele guarda na cor; e o 'vm', ele guarda nesse 'maxv', que seria a velocidade máxima que o carro consegue andar. E a velocidade inicial, ele define outro atributo, mas o valor dele é iniciado com 0, não é inicializado com nada que foi passado como parâmetro. Todo carro quando é criado, ele começa com velocidade 0, ele começa parado. Depois, se alguém quiser mudar a velocidade, vai ter que chamar o método acelere, que é o que vai mudar a velocidade. Então, aqui. Aqui está definido o construtor. Esse nome 'maxv' aqui, também, eu talvez preferiria 'maxvel', de velocidade, para deixar mais claro o nome das coisas. E quais são os métodos que essa classe tem? Ela tem três métodos. Então, note que todos os métodos: imprima, acelere e pare. A primeira variável é sempre esse 'self', que a gente não precisa passar como parâmetro. Quem vai passar como parâmetro é o próprio interpretador. E dentro do método, quando a gente quiser se referir ao próprio objeto, aos próprios atributos do meu objeto, eu vou fazer 'self', ponto, e depois o nome do atributo. Então como eu estou me referindo a mim mesmo, o objeto se refere a si mesmo, ele vai usar esse self. Então, o que faz esse 'imprima' aqui? Vamos ver! Ele faz o seguinte. Se 'self', ponto, vel, que é a velocidade. Se a velocidade é igual 0, daí quer dizer que o carro está parado. E daí, com o carro parado, a gente consegue ver o ano do carro. E dai a gente imprime o quê? Imprime o modelo, a cor e o ano. Agora, se a velocidade... Então, caso contrário. Ou seja, se a velocidade não é 0, se o carro está andando, então você não consegue ver direito o ano, nessa brincadeira aqui. Então, o que ele faz? Se a velocidade é menor que a velocidade máxima, daí a gente fala: "Esse carro aqui está indo a tantos km por hora". Então a gente fala o modelo do carro, a cor dele, ele está indo nessa velocidade aqui. Por outro lado, se a velocidade não é menor que a velocidade máxima, ou seja, se ela é maior ou igual à velocidade máxima, daí a gente está falando: "o carro desse modelo e dessa cor está indo muito rápido". Muito rápido. Então esse daqui é o método imprima e o que ele faz. Dai vamos ver o método acelere. O método acelere tem sempre aquele self, o primeiro parâmetro, e depois ele recebe como parâmetro o 'v', uma velocidade que vai ser definida. Então, por exemplo, eu preferiria colocar algo do tipo velocidade. E daí o que a gente faz? Essa velocidade, a gente guarda no atributo 'vel', primeira coisa, e depois a gente faz o seguinte. Se a velocidade que o usuário passou como parâmetro é maior que a velocidade máxima do carro. Ele quer que o fusca vá a 100km por hora. Não dá, o fusca não consegue a 100km por hora. Então o que a gente faz? A velocidade passa a ser a velocidade máxima. Então se alguém coloca uma velocidade maior que a máxima, a gente coloca exatamente a velocidade máxima do carro. E, depois, manda imprimir aqui as informações desse meu objeto. Então, note aqui. Método está chamando outro método. O método acelere, no final, ele chama o método imprima. Então, primeiro, vai executar o método acelere, e como a última linha do acelere se chama imprima, e daí, depois, ele executa o imprima e termina. Note que quando a gente acelera e cai nesse caso que a gente colocou a velocidade máxima; quando chega no imprima, ele vai cair nesse último 'else'. Porque a velocidade está igual à velocidade máxima, então, não é zero e nem menor que a velocidade máxima, ela é igual. Então, ela cai aqui dizendo que está muito rápido quando ela está nessa velocidade máxima. E daí, finalmente, tem o método pare, que fora o self, não recebe nenhum outro parâmetro. O que ele faz? Ele coloca zero na velocidade e manda imprimir. Então vamos executar isso aqui e ver o que acontece. Eu vou dar 'run' aqui, salvar, que eu fiz uma alteração. Olha o que ele faz aqui? Ele chamou o main. Ele falou, primeiro, vamos ver o passo a passo e ver o que está acontecendo. Criou esses dois carros e aqui ele acelera até 40. Quando ele faz o 'acelere até 40', ele define a variável aqui no 'acelere 40' e depois chama o imprima, daí o imprima vai lá e imprime: brasília amarela indo a 40km por hora. Depois, no segundo comando, ele vai dizer: "Carro 2, acelere até 50!" E dai, como resultado, ele vai imprimir: fuscão preto indo a 50km por hora. Depois ele fala: "Carro 1, acelere até 80!" E note que 80 era a velocidade máxima da brasília. Então, está acelerando até a velocidade máxima. E dai o que ele imprime? Brasília amarela indo muito rápido. Depois ele fala: "Carro 1, pare!" A brasília foi da velocidade máxima até parada. Deve ter feito isso três minutos. E dai o que faz o 'pare'? Ele coloca a velocidade zero e manda imprimir. Dai eu imprimi o do carro parado. Ele consegue ver aqui o ano. Então imprimi brasília amarela, 1968. E a mesma coisa no final, o fuscão preto indo muito rápido. Dessa forma, a gente viu uma classe carro com duas instâncias diferentes, com atributos diferentes. Tinha fuscão preto e uma brasília amarela. E a gente chamou métodos nesses diferentes objetos. Cada método gerou uma execução diferente. e note que cada objeto tem o seu conjunto de valores para as variáveis. Todo mundo tem os mesmos atributos, as mesmas variáveis, mas os valores, cada instância, tem seus valores diferentes. Carro é diferente de outro carro. O que a classe define é quais são os atributos que carro tem. Daí todos os carros vão ter aqueles atributos, mas o valor dos atributos varia de carro para o outro. A gente viu também que método pode chamar outro método e, eventualmente, passando parâmetros. A gente vê que método pode receber parâmetros ou não. Por exemplo, o 'imprima' aqui não tem nenhum parâmetro passado para o usuário, tem apenas o self que aquela variável que o próprio interpretador passa e que se refere ao próprio objeto. E a gente usa o self tanto para acessar os atributos desse objeto, quanto, por exemplo, para chamar outro método desse mesmo objeto. Então, já aprendemos a criar objetos com os seus construtores, manipular os atributos e como a gente define métodos dentro de uma classe. Métodos, na verdade, são funções definidas dentro do escopo de uma determinada classe. Então, essa classe carro, nesse caso, tem quatro métodos, sendo construtor e três, outros métodos. Espero que vocês tenham gostado. É ideal que se pratique pouco. Inventa alguma coisa, algum tipo de objeto que você gosta, seu objeto preferido. Se são animais, jogos, qualquer coisa, e cria uma classe representando quais são as características principais desse seu objeto preferido e, depois, tente instanciar alguns desses objetos. Então, por hoje é só. [MÚSICA] [MÚSICA] [MÚSICA]