【问题标题】:Keep getting NameError from class variable?继续从类变量中获取 NameError?
【发布时间】:2020-08-27 06:23:55
【问题描述】:

所以我试图通过创建一个类来完全理解 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 然后 Withdrawthen Balance 代码工作得很好。

但是,当我首先输入Balance 时,出现以下错误:

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

有什么帮助吗,伙计们?

【问题讨论】:

  • 在你的方法中创建全局变量完全忽略了使用类的意义。重点是封装状态,而不是使用全局状态。

标签: python function class methods


【解决方案1】:

在调用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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      “deposit_amount”是函数deposit的局部变量。因此,除非您运行存款 fn。首先,就系统而言,不存在。因此,请尝试全局初始化相同的内容。 如果您想了解局部变量和全局变量,请参阅: https://www.tutorialspoint.com/global-and-local-variables-in-python#:~:text=There%20are%20two%20types%20of,function%20where%20it%20is%20defined.

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-04
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 2014-10-29
          相关资源
          最近更新 更多