在python中调用时,balance()方法不起作用

时间:2016-04-06 03:00:05

标签: python class methods

我有一个BankAccount类,允许设置余额,存入/取出的金额,然后是返回余额的方法。

class BankAccount():

    def __init__(self, initialBalance = 0):
        self.balance = initialBalance 

    def __repr__(self):
        return("BankAccount({})".format(self.balance))

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        self.balance -= amount

    def balance(self):
        return(self.balance())

但是当我调用balance方法(b.balance())时,它会得到一个浮动对象不可调用的错误。但是,如果我将其称为b.balance,则返回适当的金额。我对错误意味着什么以及为什么方法调用不起作用感到困惑。提前谢谢!

4 个答案:

答案 0 :(得分:3)

具有相同名称的属性和方法是行不通的。您可以为属性指定不同的名称:

class BankAccount():

    def __init__(self, initialBalance = 0):
        self._balance = initialBalance 

    def __repr__(self):
        return("BankAccount({})".format(self._balance))

    def deposit(self, amount):
        self._balance += amount

    def withdraw(self, amount):
        self._balance -= amount

    def balance(self):
        return(self._balance)

print(BankAccount())

或直接访问该属性(并删除访问者方法):

class BankAccount():

    def __init__(self, initialBalance = 0):
        self.balance = initialBalance 

    def __repr__(self):
        return("BankAccount({})".format(self.balance))

    def __repr__(self):
        return("BankAccount({})".format(self.balance))

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        self.balance -= amount

print(BankAccount())

答案 1 :(得分:3)

定义类时,会定义所有方法,但不会调用它们。这包括def balance(self):。这些方法可通过参考文献获得self.methodname。当您创建此类的实例时,它会调用__init__方法,定义为def __init__(self, initialBalance=0):。此方法分配实例属性self.balance并为其提供浮点值。当你这样做时,self.balance过去指向的旧实例属性 - 你定义的方法 - 不再被引用,因此它被Python的垃圾收集器收集并消失。 / p>

关键是Python没有一个用于功能名称的包和另一个用于其他名称的包。它只包含所有实例属性名称的包,无论它们是指向浮点数,函数还是其他东西。

另外,如果你没有覆盖self.balance,那么这种方法会更加成问题,因为它自称(递归)而无法停止。因此,当你调用它时,它会调用自身,然后永远调用自身,产生错误。

完全删除定义的def balance(self):方法。看起来它没有做任何有用的事情,您可以直接访问self.balance属性。

答案 2 :(得分:0)

除去

def balance(self)

这是一个属性。如果您有属性,则不需要检索方法

答案 3 :(得分:0)

self.balance()调用BankAccount类的balance方法,b.balance是BankAccount对象的balance属性。

因为return不是一种方法,你不能返回(某事),这就是为什么你得到一个错误,说self.balance()浮动是不可调用的。但是当你执行b.balance时,它是一个完全有效的语法,它返回balance属性的值,即当前余额。

建议:属性平衡和方法平衡有不同的名称(可能是check_balance)。