所以我试图通过创建一个类来完全理解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_amount
和withdraw_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
引用它。