Разработайте класс с именем Account и протестируйте его - PullRequest
0 голосов
/ 22 сентября 2019

Хорошо, у меня возникла проблема с написанием этого кода, и для него использовался тестовый код, и, несмотря ни на что, я не могу заставить его работать.

Задание, о котором идет речьговорит: Разработайте класс с именем Account, который содержит:

■ Поле личных данных int с именем id для учетной записи.

■ Поле личных данных с именем сальдо для учетной записи.

■ Поле данных с плавающей запятой с именем yearInterestRate, в котором хранится текущая процентная ставка.

■ Конструктор, который создает учетную запись с указанным идентификатором (по умолчанию 0), начальным балансом (по умолчанию 100) и годовой процентной ставкой.(по умолчанию 0).

■ Методы доступа и мутатора для id, balance и yearInInrestrestRate.

■ Метод с именем getMonthlyInterestRate (), который возвращает месячную процентную ставку.

■ Метод с именем getMonthlyInterest (), который возвращает ежемесячные проценты.

■ Метод с именем изъятия, который снимает указанную сумму с аккount.

■ Метод с именем Deposit, который вносит указанную сумму на счет.

(Подсказка: метод getMonthlyInterest () предназначен для возврата ежемесячной суммы процентов, а не процентной ставки.Используйте эту формулу для расчета ежемесячного процента: баланс * monthInterestRate.monthInterestRate - yearInterestRate / 12. Обратите внимание, что yearInterestRate - это процент (например, 4,5%).Вам нужно разделить его на 100.)

Напишите тестовую программу, которая создает объект Account с идентификатором счета 1122, балансом 20 000 долларов США и годовой процентной ставкой 4,5%.Используйте метод снятия, чтобы вывести 2500 долларов, используйте метод депозита, чтобы внести 3000 долларов, и распечатайте идентификатор, баланс, месячную процентную ставку и ежемесячные проценты.

Вот код, который у меня есть для класса:

class Account:

    def __init__(self, accountid = 0, initialbalance = 100, annualInterestrate = 0):
        self.accountid = accountid
        self.initalbalance = initialbalance
        self.annualInterestrate = annualInterestrate

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

    def id(self):
        return int(self.id)

    def annualInterestrate(self):
        return float(self.annaulInterestrate)

    def getid(self):
        return self.id

    def setbalance(self):
        return self.setbalance 

    def getannualInterestrate(self):
        return self.annualInterestrate

    def getMonthlyInterestRate(self):
        return self.annualInterestrate / 100

    def withdraw(self):
        amount = 28
        if self.balance>=amount: 
            self.balance-=amount 

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

    def getMonthlyInterest(self):
        return  balance * monthlyInterestRate. monthlyInterestRate is annualInterestRate / 12

игнорировать цифры 45 и 28 Я просто поместил их там в качестве заполнителей.

это то, что у меня есть для тестовой программы (в данный момент она неполна, так как я потерян):

from Account import Account

def main():
    account1 = Account()
    print("Account id # is", account1.getid)


    print("Beginning Balance: ", account1.setbalance)
    print("Monthly Interest Rate: ", account1.getMonthlyInterestRate())
    print("Monthly Interest: ", account1.getMonthlyInterest())

main()

Понятия не имею, что я делаю.Если у кого-то есть представление о том, что я должен делать, пожалуйста, помогите.

Я пытаюсь выяснить, как я получаю информацию в классе (или тестовой программе, если это то, что требуется), и пусть она выводит что-тонапример:

Идентификатор счета №: 1122

Начальный баланс: какой бы баланс не был после снятия и / или депозита

Ежемесячная процентная ставка: к чему бы ни приводила вся математика,

Ежемесячные проценты: опять же, к чему приведет вся математика

1 Ответ

1 голос
/ 22 сентября 2019

Прежде чем я начну говорить о функциональности класса, я расскажу о дизайне класса.

■ Частное поле данных int с именем id для учетной записи.

■Поле с частными данными с плавающей точкой с именем сальдо для счета.

■ Поле с частными данными с плавающей точкой с именем yearInterestRate, в котором хранится текущая процентная ставка.фактически делали ваше поле данных общедоступным.Рассмотрим следующий код:

class Account:
   id = 2

Идентификатор может быть доступен из любого места в коде, например (обратите внимание, что это не использует экземпляр класса):

print(Account.id)

Продолжая этот пример, мы можем иметь экземпляр с другим значением id.

class account:
  id = 2
  def __init__(self):
    self.id = 4

print(account.id)
foo = account()
print(foo.id)

К этому идентификатору все еще можно получить доступ за пределами экземпляра класса, он все еще общедоступен.Чтобы сделать его закрытым, мы добавляем __ перед переменной.Теперь мы должны получить сообщение об ошибке при попытке доступа к идентификатору экземпляра, но не тогда, когда доступ к функции является идентификатором.

class account:
  def __init__(self):
    self.__id = 4

  def getId(self):
    return self.__id

foo = account()
print(foo.getId())
print(foo.__id) # Will produce an error

Если вы все еще не уверены в этом, я бы предложил прочитать о «спецификаторах доступа»и «инкапсуляция».Хорошо, если вы читаете его на другом языке, например, Java или C ++, это точно такая же концепция.

Кроме того, я бы преобразовал accountid в int, а initialbalance и annualInterestRate в float вваш конструктор, так что вам не нужно приводить другие ваши методы "getter" (те, которые просто возвращают переменные).В любом случае они должны быть сохранены как эти типы данных, так как это требования.

В следующих пунктах отмечается, что (пропуская конструктор один, вы его получите):

■Методы доступа и мутатора для id, balance и yearInterestRate.

■ Метод с именем getMonthlyInterestRate (), который возвращает месячную процентную ставку.

■ Метод с именем getMonthlyInterest (), который возвращает ежемесячныйпроценты.

■ Метод с именем изъятия, который снимает указанную сумму со счета.

■ Метод с именем депозита, который вносит указанную сумму на счет.

Теперь, когда дизайн класса закончен, нам нужно поработать над функцией класса.Мы уменьшим код в методах «getter» (accessor), просто возвращая переменную, так как это уже правильный тип данных.Теперь нам просто нужно создать методы «setter» (мутатор), которые будут изменять значения.Глядя на ваш код, я не думаю, что у вас есть полное понимание методов получения и установки, и я опишу их кратко.

Метод получения просто возвращает переменную класса, которая в противном случае скрыта (потому что этоprivate)

Метод установки просто изменяет значение переменной класса.Вы должны сделать это через метод, потому что переменная является частной.Мы будем использовать параметр для методов установки, и он ничего не будет возвращать.

Теперь класс должен выглядеть примерно так:

'''
Random Project
--------------
This is what I use for testing things
'''
class account:
  # Constructor
  def __init__(self, id = 0, balance = 100.0, annualInterestRate = 0.0):
    self.__id = int(id)
    self.__balance = float(balance)
    self.__annualInterestRate = float(annualInterestRate)

  # Getters (Accessors)
  def getId(self):
    return self.__id

  def getBalance(self):
    return self.__balance

  def getAnnualInterestRate(self):
    return self.__annualInterestRate

  # Setters (Mutators)
  '''
  Notice that they are the exact
  same as the constructor, just
  that they edit the variables
  individually
  '''
  def setId(self, id):
    self.__id = int(id)

  def setBalance(self, balance):
    self.__balance = float(balance)

  def setAnnualInterestRate(self, annualInterestRate):
    self.__annualInterestRate = float(annualInterestRate)

Последние пункты маркированного списка:

■ Метод с именем getMonthlyInterestRate (), который возвращает месячную процентную ставку.

■ Метод с именем getMonthlyInterest (), который возвращает месячный процент.

■ Метод с именем изъятиекоторый снимает указанную сумму со счета.

■ Метод с именем Deposit, который перечисляет указанную сумму на счет.

Ваши функции снятия и пополнения в порядке, но вы должны действительновместо этого используйте параметры

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

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

Ваш метод get monthInterestRate () должен иметь значение / 12, и, наконец, monthInterestRate не определен в области действия getMonthlyInterest ().Замените его на self.getMonthlyInterestRate ().При тестировании убедитесь, что вы инициализируете свой объект Account с параметрами

Наконец, вот весь код класса:

class account:
  # Constructor
  def __init__(self, id = 0, balance = 100.0, annualInterestRate = 0.0):
    self.__id = int(id)
    self.__balance = float(balance)
    self.__annualInterestRate = float(annualInterestRate)

  # Getters (Accessors)
  def getId(self):
    return self.__id

  def getBalance(self):
    return self.__balance

  def getAnnualInterestRate(self):
    return self.__annualInterestRate

  # Setters (Mutators)
  '''
  Notice that they are the exact
  same as the constructor, just
  that they edit the variables
  individually
  '''
  def setId(self, id):
    self.__id = int(id)

  def setBalance(self, balance):
    self.__balance = float(balance)

  def setAnnualInterestRate(self, annualInterestRate):
    self.__annualInterestRate = float(annualInterestRate)

  # Calculating functions
  def getMonthlyInterestRate(self):
    return self.__annualInterestRate / 12

  def getMonthlyInterest(self):
    return self.__balance * self.getMonthlyInterestRate()

Я думаю, вы должнысделайте немного больше исследований о функциях, о том, как вы можете использовать их для упрощения вашего кода, о спецификаторах доступа к классам, чтобы вы могли понять принцип наименьших привилегий.Я знаю, что это, вероятно, не имеет смысла прямо сейчас, но с помощью нескольких поисков в Google и игры с некоторым кодом, все это будет иметь смысл.

...