Search code examples
pythonclasspython-2.7instance

Example of Class with User Input


In most of the examples I have seen online while (trying to) learn classes, the instances of the classes are defined by the programmer. Are there any ways of creating an instance of a class where it the variable that stores the class is defined by the user?

This is an example of an object from another SO question:

class StackOverflowUser:
    def __init__(self, name, userid, rep): 
        self.name = name
        self.userid = userid
        self.rep = rep

dave = StackOverflowUser("Dave Webb",3171,500)

How can this be changed so that the user can create instances based off of the class?


Solution

  • There are broadly two ways of doing it, either:

    1. 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

    2. 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')