我有一个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
,则返回适当的金额。我对错误意味着什么以及为什么方法调用不起作用感到困惑。提前谢谢!
答案 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)。