From 334ad8b0e33b5c84775ebf9266439d00612ec924 Mon Sep 17 00:00:00 2001 From: Mykhailo Date: Sun, 4 May 2025 19:31:18 +0200 Subject: [PATCH] Update IBank_part1_4[add].py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit тест прошел через: test_account_part1.py все ок. но что то я очкую :-) Отсутствует в ТЗ реализация защиты изменения на прямую имени, номера телефона и паспорта. Так же в ТЗ отсутстувет требования использования @balance.setter Но присутствует проверка этого метода в тесте test_account_part1.py в связи с этим реализовано два одинаковых метода "Внесение суммы на текущий счет": @balance.setter def balance(self, new_balance) -> None: и def deposit(self, amount: int) -> None: --- Lesson05/practice/IBank/IBank_part1_4[add].py | 104 ++++++++++++++++-- 1 file changed, 97 insertions(+), 7 deletions(-) diff --git a/Lesson05/practice/IBank/IBank_part1_4[add].py b/Lesson05/practice/IBank/IBank_part1_4[add].py index 2963077..cc60e8d 100644 --- a/Lesson05/practice/IBank/IBank_part1_4[add].py +++ b/Lesson05/practice/IBank/IBank_part1_4[add].py @@ -1,16 +1,106 @@ +import re + class Account: def __init__(self, name: str, passport: str, phone_number: str, start_balance: int = 0): - pass + Account.validate_passport_phone(passport, phone_number) + self.name = name + self.passport = passport + self.phone_number = phone_number + # self.balance = start_balance + self.__balance = start_balance # DONE: Закрываем прямой доступ к балансу + + def full_info(self) -> str: + """ + Полная информация о счете в формате: "Иван баланс: 100 руб. паспорт: 3200 123456 т.+7-900-200-02-03" + """ + return f"{self.name} баланс: {self.__balance} руб. паспорт: {self.passport} т.{self.phone_number}" + + def __repr__(self) -> str: + """ + :return: Информацию о счете в виде строки в формате "Иван баланс: 100 руб." + """ + return f"{self.name} баланс: {self.__balance} руб." + + # DONE: реализуйте getter для просмотра баланса + # Подробнее тут: https://pythobyte.com/using-getters-and-setters-in-python-5205-840ed13f/ + @property + def balance(self) -> int: + return self.__balance + + @balance.getter + def balance(self): + return self.__balance + + @balance.setter + def balance(self, new_balance) -> None: + if new_balance <= 0 or not isinstance(new_balance, int): #type(new_cost) != int: + raise ValueError("Balance must be greater than zero and integer") + self.__balance += new_balance - # TODO-0: сюда копируем реализацию класса Account из предыдущей задачи + def deposit(self, amount: int) -> None: + """ + Внесение суммы на текущий счет + :param amount: сумма + """ + self.__balance += amount - # TODO-1: добавьте проверку паспорта и телефона(в конструкторе) на соответствие заданным форматам + # @balance.setter + def withdraw(self, amount: int) -> None: + """ + Снятие суммы с текущего счета + :param amount: сумма + """ + Account.check_balance(self.__balance, amount) + self.__balance -= amount + + @staticmethod + def validate_passport_phone(passport, phone_number): + pattern = r"\d{4} \d{6}" + if not re.match(pattern, passport): + raise ValueError(f"Неверный формат паспорта") + + pattern_phone = r"[+]7-\d{3}-\d{3}-\d{2}-\d{2}" + if not re.match(pattern_phone, phone_number): + raise ValueError(f"Неверный формат телефона") + + @staticmethod + def check_balance(balance, amount): + if balance - amount < 0: + raise ValueError(f"Недостаточно средств: {balance - amount}") + + # DONE-1: напишите реализацию метода transfer() + def transfer(self, target_account: 'Account', amount: int) -> None: + """ + Перевод денег на счет другого клиента + :param target_account: счет клиента для перевода + :param amount: сумма перевода + :return: + """ + Account.validate_passport_phone(self.passport, self.phone_number) + target_account.validate_passport_phone(target_account.passport, target_account.phone_number) + Account.check_balance(self.__balance, amount) + self.withdraw(amount) + target_account.deposit(amount) + + # DONE-1: добавьте проверку паспорта и телефона(в конструкторе) на соответствие заданным форматам # В случае несоответствия выбрасываем исключение ValueError("Неверный формат телефона/паспорта") # Проверка информации на корректность - валидация # Готовые валидаторы можете взять в директории helpers - pass + if __name__ == "__main__": - account1 = Account("Иван", "3230 634563", "+7-900-765-12-34", 1000) # аккаунт с корректными данными - account2 = Account("Алексей", "323 456124", "+7-901-744-22-99") # номер паспорта задан неверно - account3 = Account("Петр", "3232 456124", "+7-904-745-47", 400) # номер телефона задан неверно + # account1 = Account("Иван", "3230 634563", "+7-900-765-12-34", 1000) # аккаунт с корректными данными + # account2 = Account("Алексей", "323 456124", "+7-901-744-22-99") # номер паспорта задан неверно + # account3 = Account("Петр", "3232 456124", "+7-904-745-47", 400) # номер телефона задан неверно + try: + account1 = Account("Иван", "3230 634563", "+7-900-765-12-34", 1000) + except ValueError as e: + print(e) + try: + account2 = Account("Алексей", "323 456124", "+7-901-744-22-99") # номер паспорта задан неверно + except ValueError as e: + print(e) + try: + account3 = Account("Петр", "3232 456124", "+7-904-745-47", 400) # номер телефона задан неверно + except ValueError as e: + print(e)