我有两个文件:
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,但不知怎的,我弄错了)
答案 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)