Was hoping can get some help with an example of building a list of users and then making a login attempt using input. Issue is when entering valid user name which is treated as a string and not class User so error emerges when trying to check the password.
code as follows:
class User():
def __init__(self, first_name, last_name, username, password, status=True):
self.first_name = first_name
self.last_name = last_name
self.password = password
self.name = first_name.title() " " last_name.title()
users = [ ]
def add_user():
new_username = input("Choose a Username: ")
while new_username in users:
new_username = input("Username already in use; choose a different username: ")
password = ""
while len(password) != 4:
password = input("Choose a 4 character password: ")
first_name = input("First name? ")
last_name = input("Last name? ")
username = User(first_name, last_name, new_username, password)
print("Welcome " username.name)
users.append(new_username)
print(users)
more = input("Add another user? (Y/N) ").lower()
if more != ("n" or "no"):
add_user()
def login():
username_entry = ""
while username_entry not in users:
username_entry = input("Username? ")
if User(username_entry).status == False:
print("Account locked")
else:
password_count = 0
password_entry = ""
if password_count < 4:
while password_entry != username_entry.password:
password_entry = input("Password? ")
password_entry = 1
print("Login details accepted. Welcome " username_entry.name)
else:
print("Login attempts exceeded. Contact customer support for assistance.")
username_entry.status=False
more = input("Login user? (Y/N) ").lower()
if more != ("n" or "no"):
login()
add_user()
login()
CodePudding user response:
You should use a dictionary to store your users and index it by username. I implemented some fixes to your code below, but here is a short list of changes/fixes:
- added a
status
attribute toUser
- changed
users
to a dictionary indexed by usernames - changed references to
User
objects to be more consistent - fixed a bug in your password checker that would never allow you to be locked out, no matter how many attempts you put in
class User():
def __init__(self, first_name, last_name, username, password, status=True):
self.first_name = first_name
self.last_name = last_name
self.password = password
self.name = first_name.title() " " last_name.title()
self.status = status
users = {}
def add_user():
while True:
new_username = input("Choose a Username: ")
while new_username in users:
new_username = input("Username already in use; choose a different username: ")
password = ""
while len(password) != 4:
password = input("Choose a 4 character password: ")
first_name = input("First name? ")
last_name = input("Last name? ")
user = User(first_name, last_name, new_username, password)
print("Welcome " user.name)
users[new_username] = user
print(users)
more = input("Add another user? (Y/N) ").lower()
if more in ("n", "no"):
break
def login():
while True:
username_entry = ""
while username_entry not in users:
username_entry = input("Username? ")
user = users[username_entry]
if user.status == False:
print("Account locked")
else:
password_count = 0
password_entry = ""
while True:
if password_count >= 3:
print("Login attempts exceeded. Contact customer support for assistance.")
user.status=False
break
password_entry = input("Password? ")
password_count = 1
if password_entry == user.password:
print("Login details accepted. Welcome " user.name)
break
more = input("Login user? (Y/N) ").lower()
if more in ("n", "no"):
break
add_user()
login()
CodePudding user response:
In your case, you should think your problem as an object oriented. Your User class should have username and status attribute. When you want to keep username list, you should append user object into list, not only username. In addition when you reach username or other attributes(status etc.) of any users, you should these operation over user object. These methodology make easier for you when your project grown up.
I added some changes into your code and make comments on changing lines.
class User():
def __init__(self, first_name, last_name, username, password, status=True):
self.first_name = first_name
self.last_name = last_name
self.password = password
self.name = first_name.title() " " last_name.title()
# Assign attributes to object...
self.status = status
self.username = username
users = [ ]
def add_user():
new_username = input("Choose a Username: ")
while new_username in users:
new_username = input("Username already in use; choose a different username: ")
password = ""
while len(password) != 4:
password = input("Choose a 4 character password: ")
first_name = input("First name? ")
last_name = input("Last name? ")
user = User(first_name, last_name, new_username, password)
print("Welcome " user.name)
# You should append user object not new_username!
users.append(user)
print(user.username)
more = input("Add another user? (Y/N) ").lower()
if more != ("n" or "no"):
add_user()
def login():
username_entry = ""
while username_entry not in (user.username for user in users):
username_entry = input("Username? ")
# Finding user adding existing before...
for user in users:
# Control username...
if(user.username == username_entry):
# Then control username locked or not?...
if user.status == False:
print("Account locked")
else:
password_count = 0
password_entry = ""
if password_count < 4:
while password_entry != user.password:
password_entry = input("Password? ")
# Increase count not entry!
password_count = 1
print("Login details accepted. Welcome " user.name)
else:
print("Login attempts exceeded. Contact customer support for assistance.")
user.status=False
break
more = input("Login user? (Y/N) ").lower()
if more != ("n" or "no"):
login()
add_user()
login()