How do I iterate over every value in a key where the value is the instance of a class?

Question:

I want to iterate over every instance i stored as a value to a number stored as a key in a dictionary. Where if I were to make an account named jason, it would be assigned 1, then if I were to make a new one, it would be assigned 2. That part is already done but the iteration part is very confusing for me. Why does it only go through the first key value pair in the dictionary?

Ps: I am new to oop this is my first oop thing where i did not follow any guides so that id would actually learn. Thank you <3


class Bank:
  serialnum = 0
  username = ""
  email = ""
  password = ""
  bal = 0
  
  
  def __init__(self,count):
    self.serialnum = count
    self.username = input("What's your username? n")
    self.email = input("What's your email? n")
    self.password = input("What's your password n")
    self.bal = input("How much balance do you have n")

    def withdraw(money):
      self.bal= bal-money 
      print (bal)
      

global count
count = 0 #counts and is the serial num
accounts = {} #accounts dictionary

def accountcreate(): #gets called when account does not exist
  global count
  while True:
    serial = int(count)
    account = Bank(count)
    print("The serial is {}".format(count))
    count += 1
    accounts[serial] = account
    print("Your account has been created, please use the username registered. ")
    break
  accountaccess()
    
    
def accountverify(name):#if accountverify returns false, prompts the accountcreate function
  username = ""
  start = 0
  balance = 0
  if 0 in accounts: #essentially means if the first account has been made
      for key in accounts: #loops through accounts in accounts dictionary
         #sets the keys gotten and sets the un to the username attribute of every key
      
        if hasattr((accounts[key]),"username") == name:
          print("logged in as ", name, "Password is n", 
                (getattr((accounts[key]), "password")), 
                "Account balance is ", getattr((accounts[key]), "bal"))

          action = input("What do you want to do? n -Withdraw n -Deposit n -Transfer n -Make another account n")
          if "make" in action:
            print("Making another account... n Please enter your credentials")
            makeaccount = accountcreate()
          
       
        else: #if username does not exist
          print("First item in list is ",(getattr((accounts[key]),"username")))
          print(accounts)
          accountask = input("Account does not exist, make a new account? Yes or No n").lower()
          if accountask == "yes":
            makeAccount = accountcreate()
       
  else: #makes first account
    ask1 = (input("Account does not exist, would you like to make an account? Yes or No n")).lower()
    if ask1 == "yes":
      makeAccount =  accountcreate()

def accountaccess(): #accesses account
  ask = (input("Do you want to access an account? Yes, or no. "))
  if ask == "yes":
    getname = (input("What is your username? ")).lower()
    ver = accountverify(getname) 
    loop = False
  
    
loop = True
while loop == True: #mainloop
  ask = (input("Do you want to access an account? Yes, or no. n")).lower()
  if ask == "yes":
    getname = (input("What is your username? ")).lower()
    ver = accountverify(getname) 
    loop = False

The replit link

It would also be helpful to know how to store the username as the name of the value since what is shown there is incredibly cryptic

In this image, every new username registered is a new instance of the Bank class. But the for loop only goes on the first one

Asked By: sh it

||

Answers:

The part of your code that is causing the issue is

if hasattr((accounts[key]),"username") == name:
          print("logged in as ", name, "Password is n", 
                (getattr((accounts[key]), "password")), 
                "Account balance is ", getattr((accounts[key]), "bal"))

The return from hasattr is a boolean and cannot be compared to name.

Try changing it too

if hasattr(accounts[key],"username"):
    if accounts[key].username == name:
        ....

Also your use of getattr() is incorrect and unnecessary since you can simply access those attributes directly.

For example:

account = accounts[key]
print(account.username)
print(account.password)
print(account.bal)

with all of that in mind your accountsverify function should look more like this:

def accountverify(name):
  start = 0
  balance = 0
  if 0 in accounts:
      for key in accounts:  
        account = accounts[key]
        if account.username == name:
          print(f"logged in as {name} Password is n {account.password} n Account balance is {account.bal}")

          action = input("What do you want to do? n -Withdraw n -Deposit n -Transfer n -Make another account n")
          if "make" in action:
            print("Making another account... n Please enter your credentials")
            makeaccount = accountcreate()
          
       
        else: #if username does not exist
          print("First item in list is ",account.username)
          print(accounts)
          accountask = input("Account does not exist, make a new account? Yes or No n").lower()
          if accountask == "yes":
            makeAccount = accountcreate()

As far as making the Bank class print the accounts name you just need to overwrite the __str__ method.

class Bank:
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return self.name
Answered By: Alexander
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.