实例 - 使用类来模拟系统访问



我正在尝试使用类和方法模拟系统访问门户。我希望能够使用 input() 询问用户的用户名,检查该输入是否是类 User 的对象,如果是,请检查用户名的密码是否正确。当我使用它的实例时,返回错误。如何修改它以使其工作?

class User(): 
    def __init__(self, username, password):
        self.username = username
        self.password = password
    def change_pw(self, new_password):
        self.password = new_password

jshannon = User("jshannon","AbC!23")
print(jshannon.username)
print(jshannon.password)
jshannon.change_pw("(i*u&y1")
print(jshannon.password)

input_user = input("What is your username? ")

print(isinstance(input_user, User))  

用户输入是字符串。总是。时期。所以你不能"检查该输入是否是类用户的对象" - 它永远不会。

此处的解决方案是维护User实例的集合,并使用输入字符串搜索匹配的用户。

class UsersCollection(object):
    def __init__(self):
        # we store users in a dict, with user.usernale as key
        self._users = {}
    def add(self, user):
        if user.username in self._users:
            raise ValueError("username '{}' already in used".format(user.username))
        self._users[user.username] = user
    def get(self, username):
        return self._users.get(username)

users = UsersCollection()
users.add(User("jshannon","AbC!23"))
input_user = input("What is your username? ").strip()
userfound = users.get(input_user)
if userfound:
   # you can do something with your user
else:
   print("sorry, we don't know you")

请注意,这当然只适合作为玩具项目。

如果你使用的是Python 3.x(我将假设),input返回一个字符串,所以isinstance(input_user, User)将始终False

您需要跟踪创建的所有User对象,并使用输入的名称搜索对象。

有几种不同的方法可以做到这一点。我将假设用户名是唯一的,因此我将在共享集中使用它们:

class User:
    users = set()
    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.users.add(username)
    def change_pw(self, new_password):
        self.password = new_password

jshannon = User("jshannon", "AbC!23")
print(jshannon.username)
print(jshannon.password)
jshannon.change_pw("(i*u&y1")
print(jshannon.password)
input_user = input("What is your username? ")
print(input_user in User.users)
# will output True if input_user is jshannon, otherwise False

请注意,这只是一个例子,它不是防弹的,也不是最好的设计(有人可能会争论users集是否属于User提示:可能不是)。如果对象的用户名在初始化后发生更改,则集合将不会更新,并且可能会得到错误的结果。这个特殊的问题可以通过将self.username更改为属性来解决,但我想这超出了本问答的范围。

我不确定这是否是你想做的,但你不能尝试这个向班级list_of_usernames = []添加列表 然后在__init__()将用户名附加到list_of_usernames末尾

print(input_user in User.list_of_usernames)

所以你的代码将看起来像这样

class User():
list_of_usernames = []
def __init__(self, username, password):
    self.username = username
    self.password = password
    self.list_of_usernames.append(username)
def change_pw(self, new_password):
    self.password = new_password

jshannon = User("jshannon","AbC!23")
print(jshannon.username)
print(jshannon.password)
jshannon.change_pw("(i*u&y1")
print(jshannon.password)

input_user = input("What is your username? ")

print(input_user in User.list_of_usernames)

最新更新