Instanceof - использование классов для симуляции доступа к системе - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь смоделировать портал доступа к системе, используя классы и методы.Я хочу иметь возможность запросить у пользователя его имя пользователя с помощью input (), проверить, является ли этот ввод объектом класса User, и если да, проверить, верен ли пароль для имени пользователя.Когда я использую экземпляр, он возвращает false.Как я могу изменить это для работы?

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))  

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Пользовательские данные - это строки. Всегда. Период. Таким образом, вы не можете «проверить, является ли этот вход объектом класса 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")

Обратите внимание, что это, конечно, подходит только для игрушечного проекта.

0 голосов
/ 23 января 2019

Я не уверен, что это то, что вы хотите сделать, но вы не можете попробовать это добавить список в свой класс 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)
0 голосов
/ 23 января 2019

Если вы используете 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 на свойство, но я полагаю, что это выходит за рамки этих вопросов и ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...