Aprendendo Python do zero

Usando a chave.

Aqui criamos um dicionário dictionary_tk.

Com informações sobre mim: meu nome, apelido e nacionalidade.

Cada atributo é uma chave no dicionário.

Assim como aprendemos como acessar um valor da lista usando índices, também podemos usar índice (no caso dos dicionários — chaves) para acessar um valor do dicionário.

Nesse exemplo, acessamos todos os atributos do dicionário.

Pegar o nome: dictionary_tk["name"]Pegar o apelido: dictionary_tk["nickname"]Pegar a nacionalidade: dictionary_tk["nationality"]Bem simples, não?!Outro conceito legal de dicionários, é que podemos usar qualquer outro tipo de dados como valor.

Nesse próximo exemplo vamos usar um inteiro como valor:Complementando aquele primeiro exemplo, agora adicionamos a chave "age" e colocamos 24 como valor.

E assim como adicionamos novos valores na lista, podemos fazer isso também em dicionários.

Lembra que uma chave sempre aponta para um valor?.Esse conceito é uma parte essencial do dicionário.

E isso também é verdade quando falamos sobre adicionar novos valores para essa estrutura de dados.

Nesse exemplo temos o dicionário dictionary_tk com os valores name, nickname e nationality.

Mas agora queremos adicionar um novo par age com o valor 24.

Simplesmente atribuímos o valor 24 para a chave age no dicionário dictionary_tk.

Nada muito complicado aqui.

Repetição: Iterando Estruturas de DadosAssim como aprendemos no Python Básico, a iteração em listas é bem simples.

Nós, desenvolvedores Python, usamos comumente o for loop:A primeira coisa é definir a nossa lista, no caso, bookshelf, que contêm livros como strings.

Então iteramos com o for.

Para cada livro (book) no bookshelf, vamos imprimir esse valor.

book é uma variável que definimos dentro do escopo do for.

Ou seja, é apenas um nome que definimos.

Podemos trocar esse nome por qualquer outra coisa, por exemplo, bla.

Mas usamos book nesse caso por semântica.

Agora, para iterar um dicionário, também podemos usar o for loop, mas temos acesso à chave, ao invés do valor:Nesse exemplo definimos a variável key, que representa cada chave do dicionário.

Para cada iteração, vamos imprimir a chave e o valor correspondente àquela chave.

Outra forma de iterar um dicionário é utilizar o método items() para que tenhamos acesso não apenas à chave, mas também ao valor:Nesse exemplo vemos que agora definimos duas variáveis para cada iteração: key e value.

Agora temos acesso a ambos os atributos do dicionário.

Vamos a outro exemplo:Aqui voltamos àquele dicionário dictionary_tk com as minhas informações.

Usamos o método items() para acessar a chave e valor, que definimos como attribute e value respectivamente.

Para cada iteção estamos imprimindo novamente.

Classes & ObjetosUm pouco de teoria:Objetos são uma tentativa de representação de objetos do mundo real como, por exemplo, carros, cachorros ou bicicletas.

Os objetos compartilham duas principais características: dados e comportamentos.

Vamos pegar o carro como exemplo.

Carros têm dados como número de rodas, número de portas, a capacidade de assentos.

E também possui comportamentos: eles aceleram, param, mostra a quantidade de combustível e muitas outras coisas.

Nós identificamos dados como atributos e comportamentos como métodos em programação orientada a objetos.

Dados → AtributosComportamentos → MétodosOutro conceito importante são as classes.

A Classe é um modelo, uma abstração, um molde que os objetos se baseam para serem criados.

No mundo real, comumente achamos muitos objetos que se agrupam no mesmo "tipo".

Como carros.

Todos com o mesmo modelo (todos têm um motor, rodas, portas, e assim por diante).

Cada carro é criado por esse mesmo modelo com os mesmos componentes.

Programação Orientada a Objetos em PythonPython, como uma linguagem orientada a objetos, tem esses conceitos: classe e objeto.

Relembrando: a classe é um modelo para um objeto, uma maneira para definir atributos e métodos.

Agora queremos definir uma classe veículo (Vehicle) em Python.

Vamos ver como a sintaxe de uma classe é definida em Python:Definimos uma classe com o termo class — e apenas isso.

Simples, não?E agora vamos criar objetos a partir desse modelo, dessa classe que definimos.

Aqui temos o car, um objeto da classe Vehicle.

(Um objeto também é comumente chamado de instância de uma classe).

Lembrando que a nossa classe Vehicle tem 4 atributos: número de rodas, tipo de tanque, capacidade de assentos e velocidade máxima.

Atribuímos esses valores quando criamos o objeto.

Esse é um exemplo de como passamos os dados dos atributos quando inicializamos o objeto:Usamos o método init.

Chamamos ele de método construtor.

Ele constrói um objeto a partir da classe definida.

Então quando criamos um novo objeto, precisamos passar para esse método os dados dos atributos.

Imagine que amamos o Tesla Model S e queremos criar um objeto desse modelo.

Tem quatro rodas, roda com energia elétrica, com cinco espaços para assento e a sua velocidade máxima é de 250km/hora.

Hora de criar!number_of_wheel: 4type_of_tank: 'electric'seating_capacity: 5maximum_velocity: 250Todos os valores atribuídos.

Mas como acessamos esses valores?.Usamos os métodos, que são os comportamentos dos objetos.

Vamos implementar isso:Aqui tem a implementação de dois métodos: number_of_wheels e set_number_of_wheels.

Chamamos de getter & setter.

getter: retorna o valor do atributosetter: atribui um novo valor ao atributoEm Python, podemos usar o @property (decorator) para definir getters e setters:E assim podemos usar esses métodos para acessar ou setar atributos:Agora vamos implementar um método que produz o som do carro.

Vamos chamar esse método de make_noise:Agora vamos chamar esse método com nosso objeto e ele vai imprimir a string “VRRRRUUUUM.

”Encapsulamento: ocultando informaçõesEncapsulamento é uma técnica para restringir acesso direto aos dados e métodos de um objeto.

Mas, ao mesmo tempo, ele facilita operações em cima desses dados através de métodos (públicos — já já vamos falar sobre isso).

“Encapsulation can be used to hide data members and members function.

Under this definition, encapsulation means that the internal representation of an object is generally hidden from view outside of the object’s definition.

” — WikipediaToda representação de um objeto fica ocultado do mundo externo.

Apenas o próprio objeto consegue interagir com seus dados internos.

Então primeiro precisamos entender como atributos e métodos públicos e não-públicos funcionam.

Atributos públicosPara uma classe Python, podemos inicializar um atributo público dentro do nosso método construtor.

Dentro do método construtor:Nesse exemplo passamos o valor de first_name como parâmetro e atribuímos ao nosso atributo público (no caso self.

first_name).

Dentro da classe:Nesse exemplo não passamos o valor no método construtor.

Apenas definimos esse atributo dentro da classe.

E, nesse caso, todos os objetos instanciados da classe (criados a partir da classe) terão esse atributo de classe inicializado com o valor "TK".

Legal!.Agora aprendemos como podemos usar atributos públicos tanto a nível de instâncias, quanto de classes.

Outra coisa interessante sobre a parte pública é que podemos gerenciar o valor desse atributo.

O que eu quero dizer com isso?.Nosso objeto pode gerenciar os valores do seus atributos: usando Get e Set para esses atributos.

Continuando com a ideia da classe Person, agora queremos atribuir um novo valor para o atributo first_name:Pronto, atualizamos o nosso atributo first_name para um novo valor (Kaio).

Bem simples.

Dado que é um atributo público, podemos atribuir novos valores sem tantos problemas.

Atributos não-públicosWe don’t use the term “private” here, since no attribute is really private in Python (without a generally unnecessary amount of work).

 — PEP 8OBS: A PEP 8 é um Style Guide for Python Code, ou seja, um guia de boas práticas para escrever código Python.

E como boa prática, desenvolvedores Python não usam o termo "privado" para atributos, dado que um atributo em Python não é realmente privado.

Por isso usamos o termo "não-público".

Assim como nosso atributo público, também podemos definir o nosso atributo não-público no método construtor e dentro da classe.

A única diferença de sintaxe é que para atributos não-públicos, usamos o underscore (_) antes do nome do atributo.

“‘Private’ instance variables that cannot be accessed except from inside an object don’t exist in Python.

However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.

g.

_spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member)” — Python Software FoundationComo escrito na Python Software Foundation, não existem atributos privados e sim atributos não-públicos com a convenção de usar underscore.

Aqui um exemplo:Veja o atributo self.

_email.

É dessa forma que definimos um atributo não-público.

We can access and update it.

Non-public variables are just a convention and should be treated as a non-public part of the API.

E, no texto da Python Software Foundation, é enfatizado que podemos acessar e atualizar esses valores não-públicos, dado que é apenas uma convenção.

Mas como convenção, deve ser respeitada como uma parte não-pública de uma classe.

Para seguir essa convenção de não acessar diretamente nossos atributos não-públicos, usamos métodos para isso.

Vamos implementar dois métodos (email e update_email) para entender como isso funciona:Agora podemos acessar esses atributos não-públicos usando métodos (públicos):Inicializamos um novo objeto com o first_name TK e email tk@mail.

comImprimimos o email acessando o atributo não-público com o métodoTentamos atribuir um novo valor para o atributo email de fora da nossa classePrecisamos tratar e respeitar nossa convenção de atributos não-públicos como uma parte não pública da classeAtualizamos nosso atributo com nosso método (público)Sucesso!.Conseguimos atualizar o dado do nosso atributo com ajuda do nosso métodoMétodos PúblicosAssim como atributos públicos, os métodos públicos também têm acesso direto de fora da classe:Vamos testar:Funciona como esperado, podemos acessar sem problemas.

Métodos não-públicosMas com métodos não-públicos não podemos acessá-los, por convenção.

Vamos implementar a mesma classe Person, mas agora com um método não-público show_age usando underscore:Agora vamos tentar chamar esse método com nosso objeto:We can access and update it.

Non-public methods are just a convention and should be treated as a non-public part of the API.

Assim como nossos atributos, nosso método não-público é apenas uma convenção.

Esse próximo exemplo mostra como podemos usar esses métodos:Nesse exemplo implementamos o método _get_age que tratamos como não-público, ou seja, só podemos usá-lo a nível de classe (ou seja, dentro da nossa classe).

Depois implementamos o método (nesse caso público) show_age que usa o método _get_age para poder acessar o atributo age.

Agora, fora da nossa classe, podemos usar o show_age, nosso método público, e apenas acessar o _get_age de dentro da nossa classe.

Lembrando de novo: é uma questão de convenção.

Resumo do EncapsulamentoCom encapsulamento, podemos garantir que a representação interna (atributos e métodos) do nosso objeto está oculto fora da nossa classe.

Herança: herdando comportamentos e característicasAlguns objetos têm algumas coisas em comum: seus comportamentos e características.

Por exemplo, eu herdei algumas características e comportamentos dos meus pais.

Como característica, herdei os olhos e cabelo.

Como comportamento, a introversão.

Em programação orientada a objetos, classes podem herdar características (dados) e comportamentos (métodos) comuns de outra classe.

Agora vamos ver um exemplo e implementá-lo em Python.

Imagine um carro.

Número de rodas, capacidade de assentos e velocidade máxima são todos atributos de um carro.

Podemos falar que um carro elétrico possui esses mesmos atributos, ou seja, ele pode herdar essas características do carro.

Implementando a classe Car:Agora, instanciamos o objeto e podemos acessar normalmente nossos atributos:Agora, queremos implementar a classe ElectricCar que vai herdar da classe Car.

Em Python, passamos a classe “pai” (no caso, a classe Car) como parâmetro da classe “filha” (ElectricCar).

Simples assim.

Passamos o Car como parâmetro de ElectricCar e usamos o método construtor para inicializar os nossos atributos.

Não precisamos de mais nenhum método ou definição de atributos, dado que a nossa classe ElectricCar já herda todas essas características.

Vamos testar!Funciona perfeitamente! Podemos acessar nossos atributos sem problemas, apenas herdando da classe Car.

That’s it!Aprendemos muitas coisas sobre o básico de Python:Como as variáveis em Python funcionamComo funciona o controle de fluxo — condicionaisComo Python lida com loop, iteração, mais especificamente while e forComo listas funcionamDicionários, uma estrutura de dados de chave-valorComo iteramos sobre essas estruturas de dadosObjetos e ClassesAtributos como dados de um objetoMétodos como comportamento de um objetoUsando getters e setters em Python & decorator propertyEncapsulamento: ocultando informaçõesHerança: herdando comportamentos e característicasParabéns! Você completou um conteúdo denso sobre Python :)Para mais posts sobre desenvolvimento de software, Python e programação em geral, me segue aqui Medium.

Have fun, keep learning, and always keep coding.

Meu Twitter & Github.

☺.

. More details

Leave a Reply