如何修复 python 中的 "name 'self' is not defined" 错误?
How to fix "name 'self' is not defined" error in python?
我正在努力学习 python OOP,我遇到了以下错误。
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()
正确执行此操作可能如下所示:
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)
请注意,我们没有将用户名和密码作为对象的初始化参数——因为一个对象在其生命周期内可以有多个用户登录,这样做没有意义。
同样,应该保密的东西(比如尝试的密码)我们没有存储在 class 成员变量中,而是严格保持为局部变量,这样它们就不会泄漏 out-of-scope。 (在真实系统中,您希望密码数据库具有加盐哈希值,而不是真实密码,如果密码数据库本身泄漏,则包含损坏)。
顺便说一句,请注意,一般来说,将您的 I/O 逻辑与您的后端存储表示相结合是一个坏主意——通常,您希望将纯对象建模您的域,并将其与与用户的任何交互区分开来发生。
我正在努力学习 python OOP,我遇到了以下错误。
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()
正确执行此操作可能如下所示:
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)
请注意,我们没有将用户名和密码作为对象的初始化参数——因为一个对象在其生命周期内可以有多个用户登录,这样做没有意义。
同样,应该保密的东西(比如尝试的密码)我们没有存储在 class 成员变量中,而是严格保持为局部变量,这样它们就不会泄漏 out-of-scope。 (在真实系统中,您希望密码数据库具有加盐哈希值,而不是真实密码,如果密码数据库本身泄漏,则包含损坏)。
顺便说一句,请注意,一般来说,将您的 I/O 逻辑与您的后端存储表示相结合是一个坏主意——通常,您希望将纯对象建模您的域,并将其与与用户的任何交互区分开来发生。