继续从类变量中获取NameError



所以我试图通过创建一个类来完全理解Python OOP,但我对不断出现的这个错误感到困惑。还在学习,所以请试着理解我在这里的初学者情况。

class Investor:
def __init__(self, name, principle, returns):
self.name = name
self.principle = principle
self.returns = returns 
def info(self):
return '{} {}'.format(self.name, self.principle)
def deposit(self):
global deposit_amount
deposit_amount = float(input('Amount: '))
return deposit_amount + self.principle + self.returns
def withdraw(self):
global withdraw_amount
withdraw_amount = float(input('Withdraw amount: '))
return self.principle + self.returns + deposit_amount - withdraw_amount
def balance(self):
if deposit_amount > 0 or withdraw_amount > 0:
return self.principle + self.returns + deposit_amount - withdraw_amount
else:
return self.principle + self.returns



investor1 = Investor('John', 5000, 0)
while True:
prompt = input('What would you like to do?n')
if prompt == 'Balance':
try:
print(investor1.balance())
except ValueError:
print(investor1.info())

elif prompt == 'Deposit':
print(investor1.deposit())
elif prompt == 'Withdraw':
print(investor1.withdraw())

输出:

What would you like to do?

当我第一次输入Deposit,然后输入Withdraw,然后输入,然后输入Balance时,代码运行得非常好。

然而,当我首先输入Balance时,我会得到以下错误:

return self.principle + self.returns + deposit_amount - withdraw_amount
NameError: name 'deposit_amount' is not defined

有什么帮助吗,伙计们?

调用deposit(self)方法时,首先声明global deposit_amount。此语句将变量置于全局范围中。在调用deposit(self)之前,无论是在balance(self)的局部函数作用域中还是在全局作用域中,都不会定义变量。因此,您会出现此错误。首先,这与OOP python无关,只是范围问题。要以面向对象的方式做到这一点,我建议您将变量作为类实例成员:

def __init__(self, name, principle, returns):
self.name = name
self.principle = principle
self.returns = returns
self.deposit_amount = 0
self.withdraw_amount = 0

当您首先输入Balance时,deposit_amountwithdraw_amount都不会被定义,这两者都是balance定义中的if语句所需要的。

;deposit_amount";是函数存款的局部变量。所以,除非你运行存款fn。首先,就系统而言,它并不存在。所以尝试全局初始化相同的。如果你想了解局部和全局变量,请参阅:https://www.tutorialspoint.com/global-and-local-variables-in-python#:~:text=有%20are%20wo%20types%20of,function%20 where%20it%20 is%20 defined。

如果您尝试在存款前提取,函数withdraw中的deposit_amount变量是未知的。您必须添加global deposit_amount并在某个地方声明这个变量,但它不是OOP风格的。最好的做法是将这个变量作为self.deposit_amount = 0添加到__init__中。然后在类Investor中定义的所有函数中通过self引用它。

最新更新