类输出中次要细节的错误

时间:2013-11-30 00:36:23

标签: python class account

我有两个文件:

class Account:
def __init__(self,id=0,balance=100.0,AIR=0.0):
    self.__id = id
    self.__balance = balance
    self.__AIR = AIR
def getd(self):
    return self.__id
def getbalance(self):
    return self.__balance
def getAnnualInterest(self):
    return self.__AIR
def setid(self,newid):
    self.__id = newid
def setbalance(self,newbalance):
    self.__balance = newbalance
def setAnnualInterestRate(self,newrate):
    self.__AIR = newrate
def getMonthlyInterestRate(self):
    return self.__AIR/12
def getMonthlyInterest(self):
    return self.__balance*self.getMonthlyInterestRate()

def withdraw(self,amount):
    if amount<=self.__balance:
        self.__balance -= amount
def deposit(self,amount):
    self.__balance += amount
def __str__(self):
    return "Account ID : {0.setid} Account Balance : {0.setbalance} Annual Interest Rate : {0.setAnnualInterestRate}".format(self)

和测试:

   from Account import Account
def main():
    accountA = Account(0,100,0)
    accountA.setid = 1234
    accountA.setbalance = 20500
    accountA.setAnnualInterestRate = 0.375
    print(accountA)
    accountA.withdraw(500)
    accountA.deposit(1500)
    print(accountA)
    print(accountA.getMonthlyInterest())
main()

我的输出大多是正确的,但有两个小的deatils我错了,我不知道代码在哪里出现问题。

帐户ID:1234帐户余额:20500年利率:0.375 账户ID:1234账户余额:20500(这应该是21500)年利率:0.375 0.0(这应该是671.875,但不知怎的,我弄错了

2 个答案:

答案 0 :(得分:1)

accountA.setbalance = 20500未调用setbalance方法。它将<{1}}属性的值更改为 20500(也就是说,在此行之后,setbalance不再是方法而是int) 。相反,您需要accountA.setbalance

然而,你所做的事情一开始就是深刻的非pythonic(你是Java / C#/ C ++程序员,不是吗?)。 Getter和setter是Python中的反模式:只需访问和更改accountA.setbalance(20500)id等。如果(并且 if),您需要在设置/访问它们时执行计算/检查,并使它们成为属性。

此外,balance 不是 Python中的私有属性。将属性标记为“私有”的pythonic方法是单个前导下划线。但是,它只是一个约定,属性本身仍然是公共的(一切都在Python中 - 它没有可见性修饰符的概念)。

答案 1 :(得分:0)

这:

accountA.setid = 1234
accountA.setbalance = 20500
accountA.setAnnualInterestRate = 0.375

不会调用这些函数。实际上你通过这种方式将函数转换为变量要调用函数,请使用以下表示法:

accountA.setid(1234)
accountA.setbalance(20500)
accountA.setAnnualInterestRate(0.375)