Class 与用户输入的示例

Example of Class with User Input

在我(尝试)学习classes 时在网上看到的大多数示例中,classes 的实例是由程序员定义的。是否有任何方法可以创建 class 的实例,其中存储 class 的变量由用户定义?

这是来自另一个 SO 问题的对象示例:

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

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

如何更改此设置以便用户可以根据 class 创建实例?

接受输入并将它们存储在变量中并使用它们创建实例

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

 name = raw_input("Enter name: ")
 userid = int(raw_input("Enter user id: "))
 rep = int(raw_input("Enter rep: "))

 dave = WhosebugUser(name, userid, rep)

大致有两种方法:

  1. 将输入完全放在 class 之外,然后像往常一样将其传递给 __init__

    user = WhosebugUser(
        raw_input('Name: '),
        int(raw_input('User ID: ')), 
        int(raw_input('Reputation: ')),
    )
    

    这可以说是一个更简单的概念;或

  2. 在 class 内输入,例如使用 class 方法:

    class WhosebugUser:
    
        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: ')),
            )
    

    然后这样称呼它:

    user = WhosebugUser.from_input()
    

我更喜欢后者,因为它保留了它所属的 class 的必要输入逻辑,并且请注意,目前两者都没有对输入进行任何验证(参见 Asking the user for input until they give a valid response)。


如果你想拥有多个用户,你可以使用唯一键将他们保存在字典中(例如他们的 userid - 请注意 Stack Overflow 允许多个用户使用相同的名称,因此 不会是唯一的):

users = {}
for _ in range(10):  # create 10 users
    user = WhosebugUser.from_input()  # from user input
    users[user.userid] = user  # and store them in the dictionary

然后每个用户都可以作为 users[id_of_user] 访问。您可以添加检查以拒绝具有重复 ID 的用户,如下所示:

if user.userid in users:
    raise ValueError('duplicate ID')