Прежде чем я начну говорить о функциональности класса, я расскажу о дизайне класса.
■ Частное поле данных 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 и игры с некоторым кодом, все это будет иметь смысл.