Повторение — менеджер банковского счёта
Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 16 из 64.
Задание
СреднеСоздай полный класс BankAccount, демонстрирующий концепции объектно-ориентированного программирования, включая переменные класса, приватные атрибуты, свойства, геттеры, сеттеры и методы.
1. Создай класс BankAccount с:
- Переменной класса
interest_rate, заданной значением0.02(2%) - Приватными атрибутами экземпляра
__owner_nameи__balance - Конструктором, который инициализирует эти атрибуты
2. Реализуй геттеры и сеттеры свойств:
- Свойством только для чтения
owner_name, которое возвращает имя владельца счёта - Свойством
balanceс:- Геттером, который возвращает текущий баланс
- Сеттером, который проверяет пополнения (отклоняя отрицательные суммы)
- Если проверка не пройдена, выведи:
"Balance cannot be negative"
3. Реализуй методы:
deposit(amount), который:- Увеличивает баланс, если сумма положительна
- Выводит
"Deposit amount must be positive"и возвращаетFalse, если сумма не положительна - Возвращает
Trueв случае успеха
withdraw(amount), который:- Уменьшает баланс, если сумма положительна и средств достаточно
- Выводит
"Withdrawal amount must be positive"и возвращаетFalse, если сумма не положительна - Выводит
"Insufficient funds"и возвращаетFalse, если сумма превышает баланс - Возвращает
Trueв случае успеха
apply_interest(), который:- Начисляет проценты на баланс, исходя из процентной ставки класса
- Возвращает сумму начисленных процентов
display_info(), который выводит сведения о счёте в следующем формате:Account Owner: [owner_name] Balance: $[balance] Interest Rate: [interest_rate]%
Требования к формату вывода
- Все сообщения об ошибках проверки должны выводиться точно в указанном виде
- Метод
display_info()должен форматировать вывод точно так, как показано выше - Процентную ставку нужно выводить в виде процентов (умножить на 100)
Попробуйте сами
from bank_account import BankAccount
# Обработчик тестовых случаев
test_case = input()
if test_case == "account_creation":
# Проверка создания счёта
account = BankAccount("Alice", 1000)
print(f"Owner: {account.owner_name}")
print(f"Initial balance: ${account.balance}")
print(f"Interest rate: {BankAccount.interest_rate * 100}%")
elif test_case == "deposit_method":
# Проверка функции пополнения
account = BankAccount("Bob", 500)
print(f"Initial balance: ${account.balance}")
# Допустимое пополнение
result = account.deposit(300)
print(f"Deposit result: {result}")
print(f"New balance: ${account.balance}")
# Недопустимое пополнение
result = account.deposit(-50)
print(f"Negative deposit result: {result}")
print(f"Balance after invalid deposit: ${account.balance}")
elif test_case == "withdraw_method":
# Проверка функции снятия средств
account = BankAccount("Charlie", 1000)
# Допустимое снятие средств
result = account.withdraw(400)
print(f"Withdrawal result: {result}")
print(f"Balance after withdrawal: ${account.balance}")
# Недопустимое снятие средств (отрицательная сумма)
result = account.withdraw(-50)
print(f"Negative withdrawal result: {result}")
# Недопустимое снятие средств (сумма превышает остаток)
result = account.withdraw(1000)
print(f"Excessive withdrawal result: {result}")
print(f"Final balance: ${account.balance}")
elif test_case == "property_access":
# Проверка доступа к свойствам и их защиты
account = BankAccount("Dave", 800)
print(f"Owner via property: {account.owner_name}")
print(f"Balance via property: ${account.balance}")
# Попытка изменить баланс (должен использоваться сеттер)
account.balance = 1200
print(f"Balance after valid setter: ${account.balance}")
# Попытка установить недопустимый баланс
account.balance = -500
print(f"Balance after invalid setter: ${account.balance}")
# Попробовать получить прямой доступ к закрытым атрибутам (должно вызвать ошибку)
try:
print(account.__owner_name)
except AttributeError:
print("Cannot access private owner_name directly")
elif test_case == "apply_interest":
# Проверить начисление процентов
account = BankAccount("Eve", 2000)
# Проверить исходный баланс
print(f"Initial balance: ${account.balance}")
# Начислить проценты
interest_earned = account.apply_interest()
expected_interest = 2000 * 0.02
print(f"Interest earned: ${interest_earned}")
print(f"New balance after interest: ${account.balance}")
print(f"Interest calculation correct: {interest_earned == expected_interest}")
elif test_case == "display_info":
# Проверить формат вывода метода display_info
account = BankAccount("Frank", 1500)
# Изменить процентную ставку, чтобы проверить переменную класса
original_rate = BankAccount.interest_rate
BankAccount.interest_rate = 0.03
print("Display info output:")
account.display_info()
# Восстановить исходную ставку
BankAccount.interest_rate = original_rate
elif test_case == "original_test_case":
# Запустить исходный тестовый код из задания
account = BankAccount("Coddy", 1000)
# Выполнить операции
account.deposit(500)
account.withdraw(200)
account.apply_interest()
# Вывести информацию о счёте
account.display_info()
# Проверить валидацию в сеттере
account.balance = 5000
print(f"Balance after setter: ${account.balance}")
# Проверить валидацию при снятии средств
account.withdraw(10000)
print(f"Final balance: ${account.balance}")Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python