Opa, tudo certo? Pense nesses nomes dificeis como convensões que foram dadas pra nomear certas coisas dentro do código, não se preocupe muito se você sabe exatamente o nome dessas coisas, foque em conseguir escrever o código em si e saiba que vai sempre ter gente pra te ajudar no que precisar.
A respeito dos nomes vou te explicar alguns aqui:
*vou colocar entre parênteses o nome em inglês pra você :)
Assim como respondido aqui modulos são nada mais do que o nome do arquivo. Dentro de um arquivo você pode ter funções, classes e variaveis globais.
Se você tem um arquivo exemplo.py
então você tem o modulo exemplo
que é o nome do seu arquivo!
Ainda nessa mesma resposta que eu citei anteriormente, temos o significado de um pacote. Que nada mais é do que a pasta onde um arquivo se encontra.
Se o módulo (arquivo) que eu citei anteriormente está na pasta meus_exemplos
então quando você for importar esse seu arquivo pra dentro de outro arquivo você faria import meus_exemplos.exemplo
.
Esse caminho que você faz dentro das pastas pra chegar em algum lugar é chamado de path
. Você tem o path do python que é o caminho que leva até o arquivo python3.exe
que é o que vai fazer você conseguir executar seu código python na versão que você tiver instalada. Você tem também o path da raiz do seu projeto que é o caminho até a pasta onde seu projeto está armazenado e onde, a partir dali o python vai começar a contar pros imports de modules e packages.
Então se você está na raiz do seu projeto e for importar outro module que está na raiz do seu projeto você vai apenas dar import nome_do_arquivo
. E se você tem o nosso módulo exemplo
dentro da pasta meus_exemplos
e outro modulo segundo_exemplo
dentro dessa mesma pasta, pra importar o exemplo
pra dentro do segundo_exemplo
você vai precisar digitar import meus_exemplos.exemplo
mesmo ambos estando no mesmo pacote (na mesma pasta), porque o importante pro python é o caminho a partir da raiz do projeto até o modulo e não o caminho a partir de um modulo até outro modulo.
De acordo com a documentação:
Classes proporcionam uma forma de organizar dados e funcionalidades juntos. Criar uma nova classe cria um novo “tipo” de objeto, permitindo que novas “instâncias” desse tipo sejam produzidas. Cada instância da classe pode ter atributos anexados a ela, para manter seu estado. Instâncias da classe também podem ter métodos (definidos pela classe) para modificar seu estado.
class Veiculo:
def __init__(self, marca, modelo, tipo):
self.marca = marca
self.modelo = modelo
self.tipo = tipo
self.tamanho_tanque_de_gasolina = 14
self.quantidade_de_gasolina = 0
def enche_o_tanque(self):
self.quantidade_de_gasolina = self.tamanho_tanque_de_gasolina
print('O tanque de gasolina agora está cheio.')
def dirige(self):
print(f'O {self.modelo} está sendo dirigido.')
Como visto no exemplo acima, uma classe é feita pra representar alguma coisa, no nosso caso um veiculo.
Como você pode ver na wikipedia instancia é um objeto cujo comportamento e estado são definidos pela classe.
O que isso significa?
Significa que quando chamamos uma classe nós temos uma instancia dela.
Quando temos uma instancia de uma classe nós chamamos essa instancia de um objeto.
No caso do nosso exemplo, pra chamar a classe Veiculo
, basta fazer:
meu_veiculo = Veiculo('Honda', 'Ridgeline', 'Truck')
Como classes representam objetos do mundo real, esses objetos tem comportamentos, seus comportamentos são contidos em funções, e essas funções são chamadas de metodos.
Ou seja, métodos nada mais são que funções que estão dentro de uma classe, por exemplo:
def dirige(self):
print(f'O {self.modelo} está sendo dirigido.')
Os atributos assim como o próprio nome ja deixa a entender são as coisas que definem um objeto. Um veiculo tem uma marca, um modelo, um tipo, etc.
Então se eu quero que meu veiculo tenha tudo isso eu tenho que definir com os atributos.
Um exemplo é a quantidade de gasolina do nosso veiculo, que fizemos começar como 0
.
self.quantidade_de_gasolina = 0
Muitas vezes nós temos que ter o objeto já com alguns atributos definidos, mas nós não queremos um valor padrão e sim que a pessoa que vá usar a classe defina esses atributos, pra isso nós temos o metodo __init__
onde cada parametro dele é obrigatório de ser passado ao criar o objeto.
class Veiculo:
# isso obriga a pessoa que criar o veiculo a dizer qual a marca, o modelo e o tipo
def __init__(self, marca, modelo, tipo):
# aqui atribuimos o que escrevemos na instancia a um atributo do nosso veiculo
self.marca = marca
self.modelo = modelo
self.tipo = tipo
O parâmetro self é uma referência à instância atual da classe e é usado para acessar variáveis (atributos) que pertencem à classe.
Por isso temos sempre que passar o self
como primeiro parâmetro de um metodo. O python não lê esse primeiro parâmetro como se fosse um parâmetro que atribuimos/queremos atribuir algo a ele, então não precisa ter medo da marca
(no nosso exemplo) que você passar ao instanciar a classe ser atribuida ao self
ou coisa do tipo.
Se você quiser importar por exemplo apenas a classe Veiculo
de dentro do exemplo
basta fazer from meus_exemplos.exemplo import Veiculo
Recomendo que leia esse pequeno livro gratuito e open source pra entender melhor como funciona.