Как исправить ошибку «имя« Я »не определено» в Python? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь изучить Python ООП, я застрял с ошибкой ниже.

Exception has occurred: NameError
name 'self' is not defined
  File "/home/khalid/Desktop/MiniProject3/test1.py", line 27, in <module>
    login = first_class (self.Bank_Users.keys(), self.Bank_Users.values())
  File "/home/khalid/anaconda3/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/khalid/anaconda3/lib/python3.7/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/home/khalid/anaconda3/lib/python3.7/runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)

Я пытался найти похожие проблемы, которые могли быть решены, но я не смог найтиспособ обойти эту ошибку.

class first_class(object):

    def __init__(self, UserName, Password, Bank_Users):
        self.UserName = UserName
        self.Password = Password
        self.Bank_Users = {"Aldo": "1234"}


    def login_or_exit(self):

        while True:
            print("Please Enter User Name")
            self.UserName = input(">> ")
            print("Please Enter Password")
            self.Password = input(">> ")

            if self.UserName in self.Bank_Users.keys() and self.Password in self.Bank_Users.values():
                print("Logging into", self.UserName)

            else:
                print("Unsuccesful!!")

login = first_class (self.Bank_Users.keys(), self.Bank_Users.values())
login.login_or_exit()

1 Ответ

2 голосов
/ 08 мая 2019

Выполнение этого может выглядеть следующим образом:

class BankLoginSystem(object):
    def __init__(self, bank_users):
        self.bank_users = bank_users
        self.logged_in_user = None
    def login_or_exit(self):
        while True:
            print("Please Enter User Name")
            attempted_user = input(">> ")
            print("Please Enter Password")
            attempted_password = input(">> ")
            if attempted_password == self.bank_users.get(attempted_user):
                self.logged_in_user = attempted_user
                print("Success!!")
                return
            else:
                print("Unsuccesful!!")

# the user database is independent of the implementation
bank_users = { "Aldo": "1234" }

login = BankLoginSystem(bank_users)
login.login_or_exit()
print("Logged in user is: %s" % login.logged_in_user)

Обратите внимание, что мы не принимаем имя пользователя и пароль в качестве аргументов инициализации объекта - поскольку объект может иметь несколькопользователи вошли в систему на протяжении всей его жизни, это не имеет смысла.

Точно так же вещи, которые должны храниться в секрете (например, попытки паролей), мы не храним в переменных членов класса, но строго хранимкак местные жители, чтобы они не выходили за рамки.(В реальной системе вы бы хотели, чтобы в вашей базе паролей были соленые хеши, а не настоящие пароли, содержащие ущерб, если утечка из самой базы паролей).

Кстати, обратите внимание, что, вообще говоря, объединяя ваш ввод / выводЛогика с вашим представлением внутреннего хранилища - плохая идея - обычно вы хотите, чтобы чистые объекты, моделирующие ваш домен, были отделены и отличались от того, что происходит с пользователями.

...