From aec9502cb4f8cd7c589b926de30ad789c71d4c95 Mon Sep 17 00:00:00 2001 From: Cfg-data Date: Wed, 27 Nov 2024 14:55:36 +0000 Subject: [PATCH] solved --- .../lab-python-oop-checkpoint.ipynb | 267 ++++++++++++++++++ lab-python-oop.ipynb | 218 ++++++++++++-- 2 files changed, 469 insertions(+), 16 deletions(-) create mode 100644 .ipynb_checkpoints/lab-python-oop-checkpoint.ipynb diff --git a/.ipynb_checkpoints/lab-python-oop-checkpoint.ipynb b/.ipynb_checkpoints/lab-python-oop-checkpoint.ipynb new file mode 100644 index 0000000..c13bc58 --- /dev/null +++ b/.ipynb_checkpoints/lab-python-oop-checkpoint.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "25d7736c-ba17-4aff-b6bb-66eba20fbf4e", + "metadata": {}, + "source": [ + "# Lab | Object Oriented Programming" + ] + }, + { + "cell_type": "markdown", + "id": "6f8e446f-16b4-4e21-92e7-9d3d1eb551b6", + "metadata": {}, + "source": [ + "Objective: Practice how to work with OOP using classes, objects, and inheritance to create robust, maintainable, and scalable code." + ] + }, + { + "cell_type": "markdown", + "id": "20c3e882-9625-471e-afb4-48a4f40c5d1b", + "metadata": { + "tags": [] + }, + "source": [ + "## Challenge 1: Bank Account" + ] + }, + { + "cell_type": "markdown", + "id": "fe982bf8-9610-4de3-aa93-256db5a05903", + "metadata": {}, + "source": [ + "Create a BankAccount class with the following attributes and methods:\n", + "\n", + "Attributes:\n", + "\n", + "- account_number (a unique identifier for the bank account)\n", + "- balance (the current balance of the account. By default, is 0)\n", + "\n", + "Methods:\n", + "\n", + "- deposit(amount) - adds the specified amount to the account balance\n", + "- withdraw(amount) - subtracts the specified amount from the account balance\n", + "- get_balance() - returns the current balance of the account\n", + "- get_account_number() - returns the account number of the account\n", + "\n", + "Instructions:\n", + "\n", + "- Create a BankAccount class with the above attributes and methods.\n", + "- Test the class by creating a few instances of BankAccount and making deposits and withdrawals.\n", + "- Ensure that the account_number attribute is unique for each instance of BankAccount.\n", + "\n", + "*Hint: create a class attribute account_count. The account_count class attribute is used to keep track of the total number of bank accounts that have been created using the BankAccount class. Every time a new BankAccount object is created, the account_count attribute is incremented by one. This can be useful for various purposes, such as generating unique account numbers or monitoring the growth of a bank's customer base.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21625526-3fae-4c55-bab5-f91940070681", + "metadata": {}, + "outputs": [], + "source": [ + "# your code goes here\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee789466-d4cf-4dd8-b742-6863d42c3e5c", + "metadata": {}, + "outputs": [], + "source": [ + "# Testing the BankAccount class\n", + "# Creating two instances of the BankAccount class with initial balances of 1000 and 500\n", + "account1 = BankAccount(1000)\n", + "account2 = BankAccount(500)\n", + "\n", + "print(\"Account 1 balance:\", account1.get_balance()) # This should print 1000\n", + "print(\"Account 1 number:\", account1.get_account_number()) # This should print 1\n", + "\n", + "print(\"Account 2 balance:\", account2.get_balance()) #This should print 500\n", + "print(\"Account 2 number:\", account2.get_account_number()) #This should print 2\n", + "\n", + "account1.deposit(500) # We depoist 500 in the first account\n", + "account1.withdraw(200) # We withdraw 200 in the first account\n", + "print(\"Account 1 balance after transactions:\", account1.get_balance()) # This should print 1300\n", + "\n", + "account2.withdraw(600) # We withdraw 600 in the 2nd account \n", + "print(\"Account 2 balance after transactions:\", account2.get_balance())# This should print insufficient balance, and still 500 in funds" + ] + }, + { + "cell_type": "markdown", + "id": "929305ed-67cb-4094-8af2-4fa9b751832a", + "metadata": {}, + "source": [ + "## Challenge 2: Savings Account\n", + "\n", + "Create a SavingsAccount class that inherits from the BankAccount class. The SavingsAccount class should have the following additional attributes and methods:\n", + "\n", + "Attributes:\n", + "\n", + "- interest_rate (the annual interest rate for the savings account. By default - if no value is provided - sets it to 0.01)\n", + "\n", + "Methods:\n", + "\n", + "- add_interest() - adds the interest earned to the account balance\n", + "- get_interest_rate() - returns the interest rate for the account\n", + "\n", + "Instructions:\n", + "\n", + "- Create a SavingsAccount class that inherits from the BankAccount class and has the above attributes and methods.\n", + "- Test the class by creating a few instances of SavingsAccount and making deposits and withdrawals, as well as adding interest." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f8848b5-05d3-4259-9e24-914537926778", + "metadata": {}, + "outputs": [], + "source": [ + "# your code goes here" + ] + }, + { + "cell_type": "markdown", + "id": "d2c84bdb-e7d1-491d-9b0e-194288702c02", + "metadata": {}, + "source": [ + "Example of testing the SavingsAccount\n", + "\n", + "- Create a SavingsAccount object with a balance of $100 and interest rate of 2%\n", + "\n", + "- Deposit $50 into the savings account\n", + "\n", + "- Withdraw $25 from the savings account\n", + "\n", + "- Add interest to the savings account (use the default 0.01)\n", + "\n", + "- Print the current balance and interest rate of the savings account\n", + "\n", + "Expected output:\n", + " \n", + " Current balance: 127.5\n", + " \n", + " Interest rate: 0.02" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bccc7f6d-d58c-4909-9314-aaf4afc1cd30", + "metadata": {}, + "outputs": [], + "source": [ + "# your code goes here" + ] + }, + { + "cell_type": "markdown", + "id": "a5455a88-a8d1-47a6-86b0-7c70647b4f31", + "metadata": {}, + "source": [ + "### Challenge 3: Checking Account\n", + "\n", + "Create a CheckingAccount class that inherits from the BankAccount class. The CheckingAccount class should have the following additional attributes and methods:\n", + "\n", + "Attributes:\n", + "\n", + "- transaction_fee (the fee charged per transaction. By default is 1$)\n", + "- transaction_count (the number of transactions made in the current month)\n", + "\n", + "Methods:\n", + "\n", + "- deduct_fees() - deducts transaction fees from the account balance based on the number of transactions made in the current month and the transaction fee per transaction. The method calculates the total fees by multiplying the transaction count with the transaction fee, and deducts the fees from the account balance if it's sufficient. If the balance is insufficient, it prints an error message. Otherwise, it prints how much it's been deducted. After deducting the fees, the method resets the transaction count to 0.\n", + "- reset_transactions() - resets the transaction count to 0\n", + "- get_transaction_count() - returns the current transaction count for the account\n", + "\n", + "Instructions:\n", + "\n", + "- Create a CheckingAccount class that inherits from the BankAccount class and has the above attributes and methods.\n", + "- Test the class by creating a few instances of CheckingAccount and making deposits, withdrawals, and transactions to deduct fees.\n", + "\n", + "Note: To ensure that the transaction count is updated every time a deposit or withdrawal is made, we need to overwrite the deposit and withdraw methods inherited from the BankAccount class. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c883c6e-3cb8-4043-92d3-12409668a28e", + "metadata": {}, + "outputs": [], + "source": [ + "# your code goes here" + ] + }, + { + "cell_type": "markdown", + "id": "8217ec46-3eae-4a7c-9c7c-d4a87aac7e6d", + "metadata": {}, + "source": [ + "Example of testing CheckingAccount:\n", + "\n", + " - Create a new checking account with a balance of 500 dollars and a transaction fee of 2 dollars\n", + " - Deposit 100 dollars into the account \n", + " - Withdraw 50 dollars from the account \n", + " - Deduct the transaction fees from the account\n", + " - Get the current balance and transaction count\n", + " - Deposit 200 dollars into the account\n", + " - Withdraw 75 dollars from the account\n", + " - Deduct the transaction fees from the account\n", + " - Get the current balance and transaction count again\n", + " \n", + "\n", + "Expected output:\n", + " \n", + " Transaction fees of 4$ have been deducted from your account balance.\n", + " \n", + " Current balance: 546\n", + " \n", + " Transaction count: 0\n", + " \n", + " Transaction fees of 4$ have been deducted from your account balance.\n", + " \n", + " Current balance: 667\n", + " \n", + " Transaction count: 0\n", + "\n", + "Note: *the print \"Transaction fees of 4$ have been deducted from your account balance\" is done in the method deduct_fees*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "faa5b148-c11b-4be0-b810-de8a7da81451", + "metadata": {}, + "outputs": [], + "source": [ + "# your code goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lab-python-oop.ipynb b/lab-python-oop.ipynb index c13bc58..1bb178a 100644 --- a/lab-python-oop.ipynb +++ b/lab-python-oop.ipynb @@ -56,21 +56,80 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "21625526-3fae-4c55-bab5-f91940070681", "metadata": {}, "outputs": [], "source": [ - "# your code goes here\n", - "\n" + "class BankAccount:\n", + " account_count = 0 # Class attribute to keep track of the number of accounts\n", + " \n", + " def __init__(self, initial_balance=0):\n", + " \"\"\"Initializes a new bank account with a unique account number and a specified balance.\"\"\"\n", + " BankAccount.increment_account_count()\n", + " self.account_number = BankAccount.account_count\n", + " self.balance = initial_balance # Set initial balance to the provided value or 0 if not provided\n", + "\n", + " @classmethod\n", + " def increment_account_count(cls):\n", + " \"\"\"Increments the account count for each new account.\"\"\"\n", + " cls.account_count += 1\n", + "\n", + " @staticmethod\n", + " def validate_amount(amount):\n", + " \"\"\"Validates if the amount is a positive number.\"\"\"\n", + " return isinstance(amount, (int, float)) and amount > 0\n", + "\n", + " def deposit(self, amount):\n", + " \"\"\"Deposits a specified amount into the account.\"\"\"\n", + " if BankAccount.validate_amount(amount):\n", + " self.balance += amount\n", + " print(f\"Deposited {amount:.2f}. New balance: {self.balance:.2f}\")\n", + " else:\n", + " print(\"Deposit amount must be a positive number.\")\n", + "\n", + " def withdraw(self, amount):\n", + " \"\"\"Withdraws a specified amount from the account.\"\"\"\n", + " if BankAccount.validate_amount(amount):\n", + " if self.balance >= amount:\n", + " self.balance -= amount\n", + " print(f\"Withdrew {amount:.2f}. New balance: {self.balance:.2f}\")\n", + " else:\n", + " print(\"Insufficient funds for withdrawal.\")\n", + " else:\n", + " print(\"Withdrawal amount must be a positive number.\")\n", + "\n", + " def get_balance(self):\n", + " \"\"\"Returns the current balance of the account.\"\"\"\n", + " return self.balance\n", + "\n", + " def get_account_number(self):\n", + " \"\"\"Returns the unique account number.\"\"\"\n", + " return self.account_number" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "ee789466-d4cf-4dd8-b742-6863d42c3e5c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Account 1 balance: 1000\n", + "Account 1 number: 1\n", + "Account 2 balance: 500\n", + "Account 2 number: 2\n", + "Deposited 500.00. New balance: 1500.00\n", + "Withdrew 200.00. New balance: 1300.00\n", + "Account 1 balance after transactions: 1300\n", + "Insufficient funds for withdrawal.\n", + "Account 2 balance after transactions: 500\n" + ] + } + ], "source": [ "# Testing the BankAccount class\n", "# Creating two instances of the BankAccount class with initial balances of 1000 and 500\n", @@ -117,12 +176,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "4f8848b5-05d3-4259-9e24-914537926778", "metadata": {}, "outputs": [], "source": [ - "# your code goes here" + "class SavingsAccount(BankAccount):\n", + " def __init__(self, initial_balance=0, interest_rate=0.01):\n", + " \"\"\"Initializes a savings account with an optional initial balance and interest rate.\"\"\"\n", + " super().__init__(initial_balance) # Initialize the base BankAccount class\n", + " self.interest_rate = interest_rate # Set the interest rate (default is 0.01)\n", + "\n", + " def add_interest(self):\n", + " \"\"\"Calculates and adds the interest to the account balance.\"\"\"\n", + " interest = self.balance * self.interest_rate\n", + " self.balance += interest\n", + " print(f\"Added interest: {interest:.2f}. New balance: {self.balance:.2f}\")\n", + "\n", + " def get_interest_rate(self):\n", + " \"\"\"Returns the current interest rate for the savings account.\"\"\"\n", + " return self.interest_rate" ] }, { @@ -151,12 +224,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "bccc7f6d-d58c-4909-9314-aaf4afc1cd30", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Deposited 50.00. New balance: 150.00\n", + "Withdrew 25.00. New balance: 125.00\n", + "Added interest: 2.50. New balance: 127.50\n", + "Current balance: 127.5\n", + "Interest rate: 0.02\n" + ] + } + ], "source": [ - "# your code goes here" + "savings_account = SavingsAccount(100, 0.02)\n", + "\n", + "# Deposit $50 into the savings account\n", + "savings_account.deposit(50)\n", + "\n", + "# Withdraw $25 from the savings account\n", + "savings_account.withdraw(25)\n", + "\n", + "# Add interest to the savings account\n", + "savings_account.add_interest()\n", + "\n", + "# Print the current balance and interest rate of the savings account\n", + "print(\"Current balance:\", savings_account.get_balance()) \n", + "print(\"Interest rate:\", savings_account.get_interest_rate()) " ] }, { @@ -189,12 +287,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "3c883c6e-3cb8-4043-92d3-12409668a28e", "metadata": {}, "outputs": [], "source": [ - "# your code goes here" + "class CheckingAccount(BankAccount):\n", + " def __init__(self, initial_balance=0, transaction_fee=1):\n", + " \"\"\"Initializes a checking account with a balance, transaction fee, and transaction count.\"\"\"\n", + " super().__init__(initial_balance) # Initialize the base BankAccount class\n", + " self.transaction_fee = transaction_fee # Set the transaction fee\n", + " self.transaction_count = 0 # Initialize transaction count to 0\n", + "\n", + " def deposit(self, amount):\n", + " \"\"\"Deposit a specified amount into the account and increment the transaction count.\"\"\"\n", + " super().deposit(amount) # Call the deposit method from BankAccount\n", + " self.transaction_count += 1 # Increment the transaction count\n", + "\n", + " def withdraw(self, amount):\n", + " \"\"\"Withdraw a specified amount from the account and increment the transaction count.\"\"\"\n", + " super().withdraw(amount) # Call the withdraw method from BankAccount\n", + " if amount > 0: # Only increment transaction count if the withdrawal was successful\n", + " self.transaction_count += 1\n", + "\n", + " def deduct_fees(self):\n", + " \"\"\"Deduct transaction fees based on the number of transactions made.\"\"\"\n", + " total_fee = self.transaction_count * self.transaction_fee\n", + " if self.balance >= total_fee:\n", + " self.balance -= total_fee\n", + " print(f\"Transaction fees of {total_fee}$ have been deducted from your account balance.\")\n", + " self.reset_transactions() # Reset transaction count after fee deduction\n", + " else:\n", + " print(\"Insufficient funds to cover transaction fees.\")\n", + "\n", + " def reset_transactions(self):\n", + " \"\"\"Resets the transaction count to 0.\"\"\"\n", + " self.transaction_count = 0\n", + "\n", + " def get_transaction_count(self):\n", + " \"\"\"Returns the current transaction count.\"\"\"\n", + " return self.transaction_count" ] }, { @@ -234,13 +366,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "faa5b148-c11b-4be0-b810-de8a7da81451", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Deposited 100.00. New balance: 600.00\n", + "Withdrew 50.00. New balance: 550.00\n", + "Transaction fees of 4$ have been deducted from your account balance.\n", + "Current balance: 546\n", + "Transaction count: 0\n", + "Deposited 200.00. New balance: 746.00\n", + "Withdrew 75.00. New balance: 671.00\n", + "Transaction fees of 4$ have been deducted from your account balance.\n", + "Current balance: 667\n", + "Transaction count: 0\n" + ] + } + ], "source": [ - "# your code goes here" + "# Testing the CheckingAccount class\n", + "\n", + "# Step 1: Create a new checking account with a balance of 500 dollars and a transaction fee of 2 dollars\n", + "checking_account = CheckingAccount(500, 2)\n", + "\n", + "# Step 2: Deposit 100 dollars into the account\n", + "checking_account.deposit(100)\n", + "\n", + "# Step 3: Withdraw 50 dollars from the account\n", + "checking_account.withdraw(50)\n", + "\n", + "# Step 4: Deduct the transaction fees from the account\n", + "checking_account.deduct_fees() \n", + "\n", + "# Step 5: Get the current balance and transaction count\n", + "print(\"Current balance:\", checking_account.get_balance()) \n", + "print(\"Transaction count:\", checking_account.get_transaction_count()) \n", + "\n", + "# Step 6: Deposit 200 dollars into the account\n", + "checking_account.deposit(200)\n", + "\n", + "# Step 7: Withdraw 75 dollars from the account\n", + "checking_account.withdraw(75)\n", + "\n", + "# Step 8: Deduct the transaction fees from the account again\n", + "checking_account.deduct_fees() \n", + "\n", + "# Step 9: Get the current balance and transaction count again\n", + "print(\"Current balance:\", checking_account.get_balance()) \n", + "print(\"Transaction count:\", checking_account.get_transaction_count()) " ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c29aba23-d205-4c2f-b924-1d49b1fdbf5b", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -259,7 +445,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.12.4" } }, "nbformat": 4,