Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

[Sugestão] Resolução do Projeto

O projeto inteiro está aqui, na pasta accounts; os outros arquivos são exercícios que fiz para melhor entender classes e afins.

O projeto tem as classes Account, Client e Date, além de suas instancias (com accounts e clients em arquivos separados).

Em Account, separei métodos e funções em sua ordem lógica. As contas são jogadas em um dicionário e não numa lista, pq tanto faz onde estão. Isso ajuda depois na hora de buscar uma conta: vc digita Account.accounts[123].holder.full_name e o nome aparece.

Ainda não ficou claro para mim a diferença de static, class e instance methods.

No main há vários exercícios onde tentei extrair informações. Vale a pena rodá-los depois.

Por fim, para ter um dicionário com todos os bancos e seus códigos e não ter que hard code nada, usei o GPT para usar uma API e construir um arquivo generate_banks.py:

import requests
import json

response = requests.get("https://brasilapi.com.br/api/banks/v1")
data = response.json()

banks = {item['code']: item.get('fullName', 'Unknown') for item in data}

with open("accounts/bank_list.py", "w") as f:
    f.write(f"banks = {json.dumps(banks, indent=4)}")

Assim, constrói-se um dicionário banks num arquivo bank_list.py que subsequentemente importa-se em main.py e account.py. Voce pode procurar por um banco com o método dele

print(f"Bank you want: {Account.bank_code('1')}", "\n")
print(f"{Account.accounts[222].holder.full_name}'s exotic, he has an account at {Account.bank_code('612')}, cuz that's how he rolls.")

e sua resposta será

Bank you want: Banco do Brasil S.A. 

Kevin Lomax's exotic, he has an account at Banco Guanabara S.A., cuz that's how he rolls.
6 respostas

Olá Rafael, tudo bem?

Obrigada por compartilhar seu projeto conosco! Fico feliz em ver que você está se esforçando para entender melhor a Orientação a Objetos em Python.

Sobre a sua dúvida em relação às diferenças entre static, class e instance methods, posso te explicar brevemente.

  • Static methods são métodos que pertencem à classe, mas não dependem de nenhuma instância da classe para serem executados. Eles são úteis quando você precisa de uma função que não precisa de nenhum atributo ou método da instância da classe.

  • Class methods são métodos que pertencem à classe e são executados em relação à classe, em vez de uma instância específica. Eles são úteis quando você precisa de uma função que precisa acessar atributos da classe, mas não precisa de nenhuma instância específica.

  • Instance methods são métodos que pertencem à instância da classe e são executados em relação a essa instância específica. Eles são úteis quando você precisa de uma função que precisa acessar atributos ou métodos específicos da instância.

Espero ter ajudado a esclarecer um pouco mais sobre esses conceitos. Se tiver alguma outra dúvida, é só perguntar!

Bons estudos!

Olá, Nico!

Ainda não me é muito claro como exatamente decidir se um método será de classe ou instância. O problema conceitual aqui é na hora de construir os métodos e saber quando e como utilizar cada um.

Valeu!

Vou tentar dar uma pequena orientação.

Um método estático é como se fosse uma função ligada a classes. Ou seja, você não precisa de uma instância e não usa o "self" ou "this", porque não possui estado. É como se fosse um procedimento. Ao usar esses métodos, você não está programando de forma orientada a objeto, então tome cuidado, pois você está desviando do paradigma OO. Esses métodos devem ser exceção. Alguns "puristas" afirmam que não deveria haver nenhum método estático em uma classe.

Os métodos de instância são, ou pelo menos deveriam ser, o padrão. Eles usam "self" ou "this" para acessar o estado do objeto. Dessa forma, você organiza melhor o seu código e garante que o estado e o comportamento estejam sempre juntos.

Tudo bem?

abs

Sim, faz mais sentido assim, inclusive a ideia de não usar métodos estáticos. Voce tem alguma sugestão para melhor estudar a questão de state?

De todo modo, Nico, obrigado desde já pela atenção e carinho!

solução!

O que te aconselho buscar mais informações sobre Testes (principalmente teste de unidade) e Domain Driven Design. Um código bem testado normalmente é um código simples, coeso com baixo acoplamento. E Domain Driven Design tenta alinhar o problema do negocio com o seu código, criando um modelo de domínio rico e bem definido.

Tudo bem?

abs, Nico

Show de bola, Nico! Obrigado demais pela dica, meu caro!