OOP in Python: Part 6 Key Concepts to Understand When Working with OOP in Python

winstonmhango23

7 min read

Views: 266

Object-Oriented Programming (OOP) is a paradigm that allows developers to structure programs so that properties and behaviors are bundled into individual objects

Object-Oriented Programming (OOP) is a paradigm that allows developers to structure programs so that properties and behaviors are bundled into individual objects. In Python, OOP is a core feature that helps to build robust, scalable, and maintainable applications. This post addresses some of the key questions and concepts about OOP in Python, using examples related to banking systems.

Table of Contents

  1. The self Keyword
  2. Types of Arguments in Python Functions
  3. Constructor Functions
  4. Instance Variables vs. Class Variables
  5. Class Methods vs. Instance Methods
  6. Examples: Customers, Bank Tellers, and Accounts

1. The self Keyword

Concept

The self keyword in Python is used within a class to refer to the instance of the class. It is a reference to the current object and allows access to the attributes and methods of the class.

Explanation

  • Why self?: self allows each object to keep track of its own data. It distinguishes between different instances of the same class.
  • Usage: self must be the first parameter of any method in a class.

Syntax

class BankAccount:
    def __init__(self, account_id, name):
        self.account_id = account_id
        self.name = name
        self.balance = 0.0
        self.loan = 0.0

    def deposit(self, amount):
        self.balance += amount

Example

account = BankAccount("001", "John Doe")
account.deposit(100)
print(account.balance)  # Output: 100.0

2. Types of Arguments in Python Functions

Concept

Python functions can accept different types of arguments, allowing for flexible function signatures and usage.

Explanation

  • Positional Arguments: Passed to the function in the correct order.
  • Keyword Arguments: Passed to the function with a key-value pair.
  • Default Arguments: Have default values if no argument is provided.
  • Variable-Length Arguments: Accept a variable number of arguments using *args and **kwargs.

Syntax

def function_example(pos_arg, default_arg=10, *args, **kwargs):
    print(pos_arg)
    print(default_arg)
    print(args)
    print(kwargs)

Example

function_example(1, 20, 3, 4, 5, key1='value1', key2='value2')
# Output:
# 1
# 20
# (3, 4, 5)
# {'key1': 'value1', 'key2': 'value2'}

3. Constructor Functions

Concept

A constructor function is a special method that gets called when an object is instantiated. In Python, this is the __init__ method.

Explanation

  • Purpose: Initialize the object's attributes.
  • Difference from Java: In Python, constructors are defined using __init__, whereas in Java, constructors are methods with the same name as the class.

Syntax

class BankAccount:
    def __init__(self, account_id, name):
        self.account_id = account_id
        self.name = name
        self.balance = 0.0
        self.loan = 0.0

Example

account = BankAccount("001", "John Doe")
print(account.name)  # Output: John Doe

4. Instance Variables vs. Class Variables

Concept

  • Instance Variables: Variables that are unique to each instance of a class.
  • Class Variables: Variables that are shared among all instances of a class.

Explanation

  • Instance Variables: Defined within methods using self.
  • Class Variables: Defined directly in the class.

Syntax

class BankAccount:
    interest_rate = 0.05  # Class variable

    def __init__(self, account_id, name):
        self.account_id = account_id  # Instance variable
        self.name = name  # Instance variable
        self.balance = 0.0  # Instance variable

Example

account1 = BankAccount("001", "John Doe")
account2 = BankAccount("002", "Jane Smith")

print(account1.interest_rate)  # Output: 0.05
print(account2.interest_rate)  # Output: 0.05

BankAccount.interest_rate = 0.06
print(account1.interest_rate)  # Output: 0.06
print(account2.interest_rate)  # Output: 0.06

5. Class Methods vs. Instance Methods

Concept

  • Instance Methods: Operate on an instance of the class and can access both instance and class variables.
  • Class Methods: Operate on the class itself and are defined using the @classmethod decorator.

Explanation

  • Instance Methods: Take self as the first parameter.
  • Class Methods: Take cls as the first parameter and are used to access or modify the class state.

Syntax

class BankAccount:
    interest_rate = 0.05

    def __init__(self, account_id, name):
        self.account_id = account_id
        self.name = name
        self.balance = 0.0

    def deposit(self, amount):
        self.balance += amount

    @classmethod
    def set_interest_rate(cls, rate):
        cls.interest_rate = rate

Example

account = BankAccount("001", "John Doe")
account.deposit(100)

print(account.balance)  # Output: 100.0

BankAccount.set_interest_rate(0.06)
print(BankAccount.interest_rate)  # Output: 0.06

6. Examples: Customers, Bank Tellers, and Accounts

Customer Class Example

class Customer:
    def __init__(self, customer_id, name):
        self.customer_id = customer_id
        self.name = name
        self.accounts = []

    def add_account(self, account):
        self.accounts.append(account)

    def get_accounts(self):
        return self.accounts

# Example usage
customer = Customer("001", "John Doe")
account1 = BankAccount("001", "John Doe")
account2 = BankAccount("002", "John Doe")
customer.add_account(account1)
customer.add_account(account2)

for acc in customer.get_accounts():
    print(acc.account_id)
# Output:
# 001
# 002

Bank Teller Class Example

class BankTeller:
    def __init__(self, teller_id, name):
        self.teller_id = teller_id
        self.name = name

    def open_account(self, account_id, name):
        return BankAccount(account_id, name)

    def deposit_money(self, account, amount):
        account.deposit(amount)
        return account.balance

    def withdraw_money(self, account, amount):
        return account.withdraw(amount)

# Example usage
teller = BankTeller("T001", "Alice")
account = teller.open_account("003", "Jane Doe")
print(teller.deposit_money(account, 500))  # Output: 500.0
print(teller.withdraw_money(account, 200))  # Output: 300.0

Summary

In this post, we've explored key concepts in Object-Oriented Programming in Python, including the self keyword, types of function arguments, constructor functions, instance vs. class variables, and class vs. instance methods. By using examples related to bank accounts, customers, and bank tellers, we demonstrated how these concepts are applied in real-world scenarios. Understanding these principles is crucial for developing robust, maintainable, and scalable applications using Python's OOP features.

Recent Related Posts

Related Posts

Creating and uploading a Python package to the PyPi: Part 3 Creating The package and uploading to pypi.org

In this part of the series, we will walk you through the final steps of creating a Python package and uploading it to PyPi. We will use the example package bank_creator that we discussed in Part 2. The full code for this package can be found on GitHub.

Read More

Creating and uploading a Python package to the PyPi: Part 2 Creating Git repository and uploading to github

Read More

Creating and uploading a Python package to the PyPi: Part 1 Basics

Read More

© 2024 .