2013-11-30 1 views
0

У меня есть два файла:Ошибки в мелких деталях в выходе класса

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

сам .__ баланс не меняется, так как депозит и снятие вызывают. Я новичок в python, поэтому я не уверен в переменных в классах, но, похоже, проблема возникает. – fuesika

+0

Почему ваш строковый формат вызывает методы настройки (setid, setbalance ...) – Hacketo

+0

self.getbalance() дает правильные результаты. – fuesika

ответ

0

Это:

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

не вызывает функции. Таким образом, вы фактически меняете функции на переменные. Для вызова функции использовать эти обозначения:

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

accountA.setbalance = 20500 не вызывается метод setbalance. Он изменяет значение атрибута setbalanceдо 20500 (т. Е. После этой строки accountA.setbalance - это уже не метод, а int). Вместо этого вы хотите accountA.setbalance(20500).

Однако, что вы делаете, в первую очередь глубоко не-pythonic (вы программист на Java/C#/C++, не так ли?). Getters и seters - это анти-шаблон в Python: просто войдите и измените id, balance и др. атрибуты и сделать их свойствами, если (и только if) вам необходимо выполнить вычисления/проверки при настройке/доступе к ним.

Кроме того, __attribute является не частный атрибут в Python. Питонический способ отметить атрибут как «частный» - это одиночный ведущий символ подчеркивания. Тем не менее, это просто соглашение, и сам атрибут по-прежнему будет общедоступным (все всегда в Python - в нем нет понятия модификаторов видимости).

+0

Я в основном балуюсь на C++. Не очень знакомы в python. – user3048478

 Смежные вопросы

  • Нет связанных вопросов^_^