There are broadly two ways of doing it, either:
Have the input entirely outside the class, and just pass it in to __init__
as normal:
user = StackOverflowUser(
raw_input('Name: '),
int(raw_input('User ID: ')),
int(raw_input('Reputation: ')),
)
which is arguably a simpler concept; or
Take input within the class, e.g. using a class method:
class StackOverflowUser:
def __init__(self, name, userid, rep):
self.name = name
self.userid = userid
self.rep = rep
@classmethod
def from_input(cls):
return cls(
raw_input('Name: '),
int(raw_input('User ID: ')),
int(raw_input('Reputation: ')),
)
then call it like:
user = StackOverflowUser.from_input()
I prefer the latter, as it keeps the necessary input logic with the class it belongs to, and note that neither currently has any validation of the input (see e.g. Asking the user for input until they give a valid response).
If you want to have multiple users, you could hold them in a dictionary using a unique key (e.g. their userid
- note that Stack Overflow allows multiple users to have the same name, so that wouldn't be unique):
users = {}
for _ in range(10): # create 10 users
user = StackOverflowUser.from_input() # from user input
users[user.userid] = user # and store them in the dictionary
Then each user is accessible as users[id_of_user]
. You could add a check to reject users with duplicate IDs as follows:
if user.userid in users:
raise ValueError('duplicate ID')