python - 继续从类变量中获取 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
任何帮助,伙计们?
解决方案
调用方法global deposit_amount
时首先声明。deposit(self)
该语句将变量置于全局范围内。在对变量的调用之前 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
推荐阅读
- android - 如何理解 logcat 错误 java.lang.RuntimeException: Canvas: 试图绘制太大的位图 (109320552bytes)
- javascript - 如何在html中更改表格单元格的颜色
- python - 是否可以在子类模型中使用 Tensorflow Keras 功能 API?
- typescript - 使用枚举和泛型在 typescript 中获取星期几
- python - 如何获取主机名或基本 URL
- python - 网页抓取:错误“NoneType”对象没有属性“文本”
- android - 如何在 Android 11 中打开自定义图库
- c - 在 M1 芯片中运行 Armv8 代码
- mysql - mysql docker如何通过环境设置白名单
- html - 在 HTML5 中,您可以在嵌套形式中使用多个带有类的 div 标签