[MÚSICA] Olá, bom dia, boa tarde, boa noite. Vamos agora aprender conceito muito importante desenvolvimento de software e ciência da computação, que é a programação orientada a objetos. Programação orientada a objetos, ou a gente às vezes chama de PO, é paradigma de programação, que é o mais utilizado na indústria de software hoje dia e ajuda a gente a construir sistemas de software mais complicados, mais complexos, mais sofisticados, na verdade. Então, vamos aprender como isso funciona, e essa é uma parte do curso que você precisa prestar bastante atenção, eventualmente assistir os seus vídeos mais que uma vez, para adquirir, para incorporar todos esses conceitos, está? Quando a computação eletrônica surgiu na década de 1940, os computadores eram programados por meio de cabos, que as pessoas conectavam assim, mas logo foram desenvolvidas melhores formas de programação. Uma das primeiras coisas que aconteceu, foi o surgimento das linguagens de máquina, onde introduzindo uma sequência muito longa de zeros e uns a gente podia escrever programas de computador. Mas esses programas compostos só por zeros e uns enormes, você pode imaginar a quantidade de erros que eram cometidos e a dificuldade de se programar uma linguagem desse tipo. Então, se criou a linguagem de montagem, o Assembly Language, que contêm comandos aí pouco mais inteligíveis para o ser humano. Então, por exemplo, ADD AX, BX era comando para somar o registrador AX no registrador BX, o registrador é uma porção da memória muito pequena e muito rápida que tem dentro do processador. INC era comando para incrementar alguma variável, algum registrador, por exemplo. Então, a gente tinha esses comandos ali e a gente escrevia programas de computador com uma sequência desses comandos. Mas ainda uma coisa próxima do funcionamento da máquina e longe da nossa linguagem comum dos seres humanos, da linguagem da matemática, e assim por diante, né? Então começaram a pensar na criação de linguagens de alto nível. Particular, cientistas preocupados construir uma tradução de fórmulas matemáticas para linguagem de montagem, criaram a linguagem Fortran que significa Formula Translator, Fortran foi a primeira linguagem de alto nível que foi inventada. Posteriormente, outras linguagens pouco mais sofisticadas, com modelo conceitual mais sofisticado foram desenvolvidas, por exemplo, ALGOL introduziu o que a gente chama de programação procedimental, porque na época se falava programação estruturada. Também surgiu a linguagem Lisp, que trouxe a ideia de programação funcional, onde tudo são funções e a gente pode fazer encadeamento de funções para fazer diferentes construções. E, na década de 80 surgiu a ideia de representar objetos do mundo real através de elementos computacionais nos nossos programas de computador. Então, isso surgiu inicialmente num laboratório lá na Noruega, laboratório que se chamava Simula, onde eles faziam programas de computador que simulavam o comportamento de gases. Então, eles tinham que representar 1000 moléculas de determinado gás, mais 5000 moléculas de outro determinado gás, quando a gente coloca eles no espaço, como é que é a interação entre as moléculas, né? E daí eles começaram a ver que seria interessante ter uma linguagem de programação, onde a gente pudesse representar cada molécula, o comportamento dessa molécula, e daí, criar várias, nesse caso, 1000 instâncias de uma molécula e 5000 instâncias de outra molécula e executar o programa e cada molécula tem o seu comportamento autônomo, interagindo com os outros. Então, criou-se a linguagem Simula, que foi a primeira linguagem orientada a objetos, que tinha uma forma de eu representar esses tipos de objetos e depois executar os objetos, e os objetos trocavam informações entre si, trocavam mensagens entre si. Então vamos ver como é esse modelo aí de programação orientada a objetos. Então, na programação orientada a objetos, a gente tem elemento básico que é o objeto, que nada mais é do que algo que encapsula, que guarda dentro de si algumas estruturas de dados, alguns dados, algumas variáveis por exemplo, e mais código. O código são instruções na sua linguagem de programação, por exemplo, Python, código que manipula aqueles dados. E, tem essa ideia de encapsulamento, a gente cria cápsulas, onde cada cápsula é objeto, e que vai ter aquele código que manipula aqueles dados e a ideia é evitar que código de objeto fique mexendo com o código de outros objetos. Criar aí uma confusão ali entre os objetos, então, código de objeto não deve mexer com outros objetos, se ele quiser se comunicar com outro objeto, ele envia uma mensagem para o outro objeto. Como eu falei, a gente vai ter, naquela simulação de gases, 6000 objetos interagindo. Mas na verdade, são só dois tipos de objetos, eu falei dois tipos de gases então, cada gás teria tipo da molécula do gás, e daí, para representar esses tipos desses objetos, a gente cria o que a gente chama de uma classe, que vai definir quais são as classes dos objetos no meu programa. E as classes definem então os tipos do objeto, normalmente o nome da classe representa muito bem o que é aquela classe, por exemplo, você pode ter uma classe oxigênio, representando moléculas de oxigênio e uma classe hidrogênio ou uma classe vapor de água, representando as moléculas desses outros tipos de gases. E daí, cada classe vai definir quais são os dados, quais são os atributos, as variáveis que os objetos daquela classe vão ter, e também o código dos objetos, ou as funções ali que eu vou poder executar para manipular aqueles dados. Então, as classes definem essas coisas. Os dados, a gente chama de atributos do objeto, ou atributos da classe, e o código a gente chama de métodos ou funções daquela classe, funções ou métodos daquele objeto. E a gente diz que os objetos são chamados de instâncias das classes. Então, eu vou ter 1000 instâncias da classe oxigênio, vou ter 5000 instâncias da classe hidrogênio, por exemplo. Então, as instâncias são instâncias das classes. Vamos ver exemplinho rapidinho. Vamos supor que a gente tem uma classe carro e que representa o que carro tem si, né? E a gente vai ter, pode ter muitos carros, então são muitas instâncias dessa classe carro. Eu vou, para fazer uma brincadeirinha, eu vou criar duas instâncias, uma chamada de meu_carro porque vai ter informações sobre o meu carro, e outra chamado de carro_do_ime, que é o carro lá do local onde eu trabalho aqui no Ime. E quais são os atributos que eu vou ter nessa classe carro? Eu vou guardar informações sobre carro, por exemplo, o ano do carro, o modelo, a cor e vamos supor que eu quero fazer algum cálculo com a velocidade, a velocidade que ele está se movendo nesse instante. E daí, eu posso ter métodos que vão manipular esses valores, por exemplo, eu posso ter método de acelera, que recebe como parâmetro uma velocidade, daí ele vai mudar a velocidade com o qual o carro está andando, eu posso ter uma classe pare, que faz com que a velocidade vá para zero, e assim por diante, podia ter outros métodos também. Vamos agora, tentar implementar isso. Como é que a gente implementaria? Deixa eu abrir aqui o meu iDLE. Primeiro eu vou criar uma classe, ensinar a criar uma classe vazia, e daí criar algumas instâncias, depois a gente vê como é que a gente coloca coisas, adiciona coisas a uma classe, adiciona atributos e adiciona métodos. Mas vamos começar com uma classe vazia, para definir essa classe vazia eu digito aqui class e o nome da classe, eu vou chamar essa classe de carro, dois pontos e daí, aqui na linha de baixo, viriam os atributos, as funções ali da classe. Mas eu vou começar com ela vazia, para a gente dizer que ela é vazia eu vou simplesmente escrever pass, passo, então pronto, fazendo isso eu já defini uma classe carro que por enquanto não tem nenhum atributo nem nenhuma função. Agora, eu quero criar uma instância, quero criar objeto dessa classe carro, como é que eu faço isso? Eu posso fazer isso aqui, meu_carro =, e daí eu coloco o nome da classe e abre e fecha parênteses, pronto. Fazendo isso, eu crio novo objeto do tipo carro, então eu instanciei a classe carro, criei novo objeto do tipo carro e guardei uma referência para esse objeto novo que eu criei, nessa variável meu_carro. Então, agora meu_carro, ela se referencia a objeto ali do tipo carro. Particular, se eu digitar isso aqui, ele vai dizer que isso aqui é objeto num determinado endereço de memória, esse é número que não interessa para a gente, é o local da memória que esse objeto carro está armazenado. Normalmente, a gente nunca vai olhar para esse número. O que a gente vai fazer com o carro? Vou mostrar daqui a pouco, mas antes deixa eu criar outro carro, vou criar o carro_do_ime também vai ser uma nova instância de carro. Então, agora eu tenho duas instâncias, particular, se eu escrever aqui carro_do_ime, a gente vai conseguir ver que ele está outra posição de memória, porque o endereço daqui é diferente do endereço daqui. São dois lugares diferentes que estão armazenados esses dois carros. Deles tem uma variável chamada meu_carro, que está se referenciando a deles e o outro carro_do_ime se referenciando a outro dele, então deu dois objetos do tipo carro. Daí eu posso Primeira coisa que eu posso fazer é introduzir atributos. Como que eu defino novo atributo? Eu posso fazer assim: meu:carro.ano = 1900, ou porque eu tenho o carro aqui do meu avô, ele tinha carro de 1968 e eu quero falar meu_carro.modelo = Fusca. Ele tinha Fusca 68 azul. Meu_carro.cor = azul. Então, o que eu fiz aqui? Eu criei três atributos chamados ano, modelo e cor e armazenei valores aqui nesses três atributos de meu carro. Então, se eu agora digitar meu_carro.ano, ele vai falar que é 1968. Meu_carro.cor, ele vai falar que a cor é azul. Então, adicionei três atributos ao meu carro e coloquei ali valores. Outra coisa, eu posso por exemplo no carro do Ime definir que o ano do carro do Ime é 1981, o modelo é igual, é uma Brasília. E carro_do_Ime.cor, amarelo. Então, agora eu tenho essa outra variável, se eu perguntar: Qual que é o carro_do_Ime.modelo? Vai falar, é uma Brasília. Então, agora eu tenho duas variáveis, com esses, cada uma delas com esses três atributos com valores diferentes, o carro do Ime e modelo é Brasília. E aqui o meu carro e o modelo meu_carro.modelo é o Fusca. Note uma outra coisinha que posso fazer aqui agora, eu posso, por exemplo, ter uma outra variável chamado novo_fusca. Se eu fizer novo_fusca, se eu fizer aqui carro abre e fecha parenteses, ele vai criar uma nova instância e vai armazenar nessa variável novo_fusca. Seria terceiro carro. Agora, se ao invés de fazer isso, se eu simplesmente colocar aqui, novo_fusca = meu_carro note que eu não estou criando novo objeto. Nesse caso o novo_fusca vai está se referenciando ao meu_carro. Então, vai ser duas variáveis apontando para o mesmo objeto, não é? Particular, se eu fizer novo_fusca vou somar aqui dez no ano de fabricação dele. Eu fiz eu esqueci de colocar o, eu não posso somar dez no fusca, eu tenho que somar dez no ano do fusca. Então, novo_fusca.ano += dez. Isso. Então somei dez no ano do novo fusca, mas se eu fizer aqui meu_carro.ano foi para 1978, Lembra que antes era 1968? Mas foi para 78. Porquê? Eu somei o ano do novo fusca e o ano do meu carro acabou mudando? Sim. Porque eram duas variáveis apontando para o mesmo objeto, porque aqui eu peguei o endereço do meu carro e guardei nessa variável novo_fusca. Então, com isso a gente já aprendeu nessa primeira aulinha de programação orientada a objetos que nós temos, podemos ter classes, definir classes Python, depois a partir daí a gente pode criar instâncias dessas classes, que vão ser esses objetos e tipicamente para cada classe você vai ter muitos objetos daquele tipo, daquela classe. As classes podem ter atributos e os atributos a gente pode atribuir valores a esses atributos e resgatar o valor desses atributos e podemos até fazer computações que nem esse novo_fusca.ano = 10. A gente fez ali uma computação alí com determinado valor de atributo. Então, na próxima aula nós vamos ver como a gente pode criar métodos que vão ser funções que vão manipular esses dados nos objetos e também vamos ver jeito mais interessante de a gente construir novos objetos Python por meio do construtor que é a função int. [MÚSICA] [MÚSICA] [MÚSICA]