March 14

Пример объектно-ориентированной программы на Python

# Создайте класс BankAccount, представляющий банковский счет.
# Класс должен иметь атрибуты для хранения баланса и статуса аккаунта
# (открыт или закрыт). Затем создайте класс Customer, представляющий клиента банка.
# Класс Customer должен содержать экземпляры класса BankAccount

from enum import Enum


class Currency(Enum):
	RUBLE = 0
	USA_DOLLAR = 1
	EURO = 2
	SHEKEL = 3


class Status(Enum):
	INACTIVE = 0
	ACTIVE = 1
	FROZEN = 2


class BankAccount:
	id = 0

	def __init__(self, currency: Currency) -> None:
		self.__balance = 0
		self.__status = Status.ACTIVE
		self.__account_number = BankAccount.id
		self.__currency = currency

		BankAccount.id += 1

	def get_balance(self) -> float:
		return self.__balance

	def get_account_number(self) -> int:
		return self.__account_number

	def get_status(self) -> Status:
		return self.__status

	def deposit(self, money: float) -> 'BankAccount':
		if self.__status == Status.ACTIVE:
			self.__balance += money
		return self

	def withdraw(self, money: float) -> 'BankAccount':
		if self.__status == Status.ACTIVE and self.__balance >= money:
			self.__balance -= money
		return self

	def change_status(self, status: Status) -> 'BankAccount':
		if self.__status != Status.INACTIVE:
			self.__status = status
		return self

	def activate(self) -> 'BankAccount':
		if self.__status != Status.INACTIVE:
			self.__status = Status.ACTIVE
		return self

	def deactivate(self) -> 'BankAccount':
		self.__status = Status.INACTIVE
		return self

	def freeze(self) -> 'BankAccount':
		if self.__status != Status.INACTIVE:
			self.__status = Status.FROZEN
		return self


class Customer:
	def __init__(self, name: str, surname: str) -> None:
		self.__name = name
		self.__surname = surname
		self.__bank_accounts: list[BankAccount] = []

	def add_bank_account(self, bank_account: BankAccount) -> 'Customer':
		self.__bank_accounts.append(bank_account)
		return self

	def remove_bank_account(self, bank_account: BankAccount) -> 'Customer':
		self.__bank_accounts.remove(bank_account)
		return self

	def get_bank_accounts(self) -> list[BankAccount]:
		return self.__bank_accounts


def main():
	customer = Customer('Игорь', 'Плотников')
	customer.add_bank_account(BankAccount(Currency.RUBLE))
	customer.add_bank_account(BankAccount(Currency.EURO))

	customer.get_bank_accounts()[0].deposit(250)
	customer.get_bank_accounts()[1].deposit(1000)

	customer.get_bank_accounts()[0].freeze()
	customer.get_bank_accounts()[0].withdraw(200)

	for bank_account in customer.get_bank_accounts():
		print(bank_account.__dict__)


if __name__ == '__main__':
	main()