Back to Python
2026-01-175 min read

Python Classes and Objects

Learn Python Classes and Objects step by step with clear examples and exercises.

Title: Python Classes and Objects - Mastering Object-Oriented Programming

Why This Matters

In this lesson, we'll delve into Python classes and objects, essential components of object-oriented programming (OOP). Understanding these concepts will empower you to write cleaner, more modular code, making your programs easier to maintain and scale. Plus, mastering OOP is crucial for acing technical interviews and solving real-world coding challenges.

Prerequisites

Before we dive in, ensure you have a solid grasp of the following:

  • Basic Python syntax (variables, data types, operators)
  • Control structures (if/else, loops)
  • Functions and modules
  • Understanding of variables' scope and lifetime
  • Familiarity with error handling using try/except blocks

Core Concept

Defining Classes

A class is a blueprint for creating objects. It encapsulates data (attributes or properties) and functions (methods) that operate on the data. Here's how to define a simple class:

class MyClass:

Class variables

class_variable = "This is a class variable"

def __init__(self, name): # Constructor

self.name = name # Instance variable

def greet(self):

print(f"Hello, {self.name}!") # Accessing instance variable

@classmethod

def class_greeting(cls):

print(f"Hello from the class, {cls.class_variable}!") # Accessing class variable


In this example, we've created a `MyClass` with two instance variables (`name`) and one class variable (`class_variable`). The `__init__()` function is the constructor that initializes an object when it's instantiated. We also added a method `greet()` for personalized greetings and a class method `class_greeting()` to print a generic greeting.

### Creating Objects (Instances)

To create an object (instance) of a class, you use the class name followed by parentheses and any required arguments:

my_object = MyClass("John Doe")

print(my_object.name) # Output: John Doe

MyClass.class_greeting() # Output: Hello from the class, This is a class variable!


### Accessing and Modifying Attributes

You can access and modify attributes of an object using the dot notation:

my_object.name = "Jane Doe"

print(my_object.name) # Output: Jane Doe


### Methods

Methods are functions that belong to a class and can be called on instances of that class or using the class directly if they're marked as `@classmethod`. Here's an example of a method that prints the name of an object:

class MyClass:

def __init__(self, name):

self.name = name

@classmethod

def from_string(cls, name_str):

name = name_str.split()

return cls(name[0] + " " + name[1]) # Concatenating first and last names

my_object = MyClass.from_string("John Doe")

print(my_object.name) # Output: John Doe

Worked Example

Let's create a class for a bank account with attributes balance, interest_rate, and account_number. Implement methods to deposit, withdraw, calculate the total interest earned over a given number of years, and print the account details:

class BankAccount:
def __init__(self, balance, interest_rate, account_number):
self.balance = balance
self.interest_rate = interest_rate / 100
self.account_number = account_number

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

def withdraw(self, amount):
if amount > self.balance:
print("Insufficient funds")
return None
self.balance -= amount
return self.balance

def calculate_interest(self, years):
interest = self.balance * (1 + self.interest_rate) ** years
return round(interest - self.balance, 2)

def print_details(self):
print(f"Account Number: {self.account_number}")
print(f"Current Balance: ${self.balance}")

account = BankAccount(1000, 5, 123456789)
print("Initial balance: $", account.balance)
account.deposit(500)
print("Deposited $500; new balance: $", account.balance)
interest = account.calculate_interest(5)
print(f"Earned ${interest} in 5 years")
account.withdraw(600)
print("Withdrew $600; new balance: $", account.balance)
account.print_details()

Common Mistakes

Forgetting the self keyword

In methods, you must use the self keyword to refer to the instance of the class:

class MyClass:
def __init__(self, name):
self.name = name # Correct
name = "John Doe" # Incorrect (should be `self.name`)

Not calling the constructor when creating an object

Always call the constructor when instantiating a class:

my_object = MyClass("John Doe") # Correct
my_object = MyClass # Incorrect (constructor not called)

Not defining a constructor

If you don't define a constructor, Python will create one for you with no arguments:

class MyClass:
pass

my_object = MyClass() # Correct (using the default constructor)
my_object = MyClass("John Doe") # Incorrect (constructor not defined to accept arguments)

Using global variables inside methods

Avoid using global variables inside methods, as it can lead to unexpected behavior and hard-to-debug issues:

def increment_global():
global x
x += 1

x = 0
increment_global()
print(x) # Output: 1 (instead of 2, since `x` was modified inside the function)

Practice Questions

  1. Write a class for a student with attributes name, age, and grades. Create an object for a student and print their details.
  2. Define a class for a car with attributes make, model, year, color, and mileage. Implement methods to calculate the car's total cost, including purchase price, sales tax, registration fee, and insurance premium.
  3. Create a class for a triangle with attributes base and height. Calculate the area of the triangle using the formula (1/2) base height.
  4. Implement a class for a circle with attributes radius, pi (a constant), and methods to calculate its circumference, area, and diameter.
  5. Write a class for a rectangle with attributes length and width. Calculate the diagonal of the rectangle using Pythagoras' theorem.

FAQ

What happens if I don't define a constructor?

If you don't define a constructor, Python will create one for you with no arguments. This default constructor initializes all instance attributes to None or their default values.

Can I have multiple constructors in a class?

Yes! You can create multiple constructors in a class by defining methods with different parameter lists and calling them from the first constructor using Python's super() function.

What is the purpose of the self keyword?

The self keyword refers to the instance of the class within the method or constructor. It allows you to access and modify attributes of that specific object.

Why should I avoid using global variables inside methods?

Using global variables inside methods can lead to unexpected behavior, as changes made to the global variable within the method will affect its value outside the method as well. This can make your code harder to understand and debug. Instead, consider passing arguments or returning values from methods to manage shared data.

Python Classes and Objects | Python | XQA Learn