带用户输入的类示例

Jos*_*rah 0 python class instance python-2.7

在大多数我在网上看到(尝试)学习类的例子中,类的实例是由程序员定义的.有没有办法创建一个类的实例,其中存储类的变量是由用户定义的?

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

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

dave = StackOverflowUser("Dave Webb",3171,500)
Run Code Online (Sandbox Code Playgroud)

如何更改以便用户可以基于类创建实例?

jon*_*rpe 9

有两种方法可以做到:

  1. 将输入完全放在课堂之外,并将其传递给__init__正常情况:

    user = StackOverflowUser(
        raw_input('Name: '),
        int(raw_input('User ID: ')), 
        int(raw_input('Reputation: ')),
    )
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 在类中输入,例如使用类方法:

    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: ')),
            )
    
    Run Code Online (Sandbox Code Playgroud)

    然后把它称为:

    user = StackOverflowUser.from_input()
    
    Run Code Online (Sandbox Code Playgroud)

我更喜欢后者,因为它保持必要的输入逻辑与它所属的类,并注意,目前都没有任何输入验证(参见例如,在他们给出有效响应之前询问用户输入).


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

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
Run Code Online (Sandbox Code Playgroud)

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

if user.userid in users:
    raise ValueError('duplicate ID')
Run Code Online (Sandbox Code Playgroud)