带用户Inpu的类示例

2024-05-14 06:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在我在网上看到的大多数学习类的例子中,类的实例是由程序员定义的。有没有什么方法可以创建一个类的实例,其中存储该类的变量是由用户定义的?

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

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

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

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


Tags: 对象实例方法用户nameself示例so
2条回答

获取输入并将其存储在变量中,并使用它们创建实例

 class StackOverflowUser:
        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 = StackOverflowUser(name, userid, rep)

大体上有两种方法可以做到这一点:

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

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

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

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

    那就叫它:

    user = StackOverflowUser.from_input()
    

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


如果你想有多个用户,你可以用一个唯一的键(例如他们的userid-注意堆栈溢出允许多个用户有相同的名字,这样就不会是唯一的):

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

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

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

相关问题 更多 >