Python

P
PythonHub
Progress 0%

Python

  • Home
  • History of Python
  • Applications of Python
  • Introduction To Python
    • What is Python
    • Character Set
    • Tokens in Python
    • Python Execution Mode
    • Variable And Identifiers
    • Data Types in Python
    • Operators And Expressions
    • Constants in Python
    • Assignment Statement
    • Input / Output in Python
    • Simple Python Scripts
    • Namespace in Python
    • 📝 Assignments
  • Operators in Python
    • Arithmetic Operators
    • Assignment Operators
    • Shorthand Assignment Operators
    • Relational Operators
    • Logical Operators
    • Bitwise Operators
    • Special Operators
    • 📝 Assignments
  • Input Output in Python
    • Accept Input
    • Output Formatting
    • 📝 Assignments
  • Conditional Statement
    • Decision Making
    • if Statement
    • IF-ELSE STATEMENT
    • IF-ELSE LADDER
    • NESTED IF-ELSE
    • Short Hand IF-ELSE
    • 📝 Assignments
  • Loops
    • Introduction to Loops
    • While Loop
    • Nested While Loop
    • 📝 While Loop Assignments
    • For Loop
    • For Loop Examples
    • Nested For Loop
    • Nested For Loop Examples
    • Infinite While Loops
    • Infinite For Loops
    • Break, Continue and Else in Loops
    • Difference Between For and While Loop
    • For Each Loop
    • 📝 For Each Assignments
    • 📝 All Loops Assignments
  • List
    • List in Python
    • Access List Elements
    • List Functions
    • Iterate (Loop) List
    • List Comprehension
    • 📝 Assignments
  • Tuple
    • Tuple in Python
    • Access Tuple Elements
    • Tuple Functions
    • Iterate (Loop) Tuple
    • Unpack Tuple
    • Tuple Comprehension
    • 📝 Assignments
  • Set
    • Set in Python
    • Access Set Elements
    • Set Methods
    • Iterate (Loop) Set
    • Pack/Unpack Set
    • Set Comprehension
    • 📝 Assignments
  • Dictionary
    • Dictionary
    • Access Dictionary Items
    • Dictionary Methods
    • Iterate (Loop) Dictionary
    • Formatting Dictionaries
    • Nested Dictionaries
    • Dictionary Comprehension
    • 📝 Assignments
  • Diff List Tuple Set Dictionary
    • List vs Tuple
    • List vs Set
    • List vs Dictionary
    • Tuple vs Set
    • Tuple vs Dictionary
    • Dictionary vs Set
    • 📝 Assignments
  • Exception
    • Error vs Exception
    • Types of Exception
    • Exception Handling
    • User Defined Exception
    • Logging Exception
    • 📝 Assignments
  • Functions
    • Introduction to Functions
    • Modular Programming
    • Types of Functions
    • Inbuilt Functions
    • Need For User-Defined Function
    • Elements of User Defined Function
    • Function Arguments
    • Nesting of Functions
    • Recursion
    • Global Local and Non Local
    • Python Lambda Functions
    • 📝 Assignments
  • Python Module
    • Introduction to Module
    • Inbuilt Modules in Python
    • User Defined Module
    • 📝 Assignments
  • File Handling
    • Introduction to Files
    • Create File
    • Read Files
    • Write to File
    • Rename File
    • Copy File
    • Move File
    • List Files in Directory
    • Binary Files
    • Zipping and Unzipping Files
    • 📝 Assignments
  • Strings
    • Basics of Strings
    • String Special Operators
    • String Formatting Operators
    • String Methods
    • 📝 Assignments
  • Regular Expressions
  • Python OOPS
    • Basics of Object Oriented
    • What are Classes and Objects?
    • Creating Class and Object
    • OOP vs Procedural Programming
    • Difference Between Classes and Objects
    • Constructors
    • Destructor
    • Built Class Methods and Attributes
    • Class and Instance Variables
    • Inheritance in Python
    • Single Inheritance
    • Multiple Inheritance
    • Multilevel Inheritance
    • Hierarchical Inheritance
    • Hybrid Inheritance
    • Abstraction
    • Method Overriding
    • Abstract Method
    • Interfaces in Python
    • Abstract Class vs Interface
    • Public, Private and Protected
    • Overloading vs Overriding
    • Inheritance vs Composition
    • Encapsulation
    • Polymorphism
    • Inner Classes
    • 📝 Assignments
  • Advanced Python
    • Iterator in Python
    • Generator in Python
    • Decorator in Python
    • Type Hints in Python
    • Async/Await Programming
    • Dataclasses in Python
    • Context Managers in Python
    • Property Decorator in Python
    • __slots__ in Python
    • Enums in Python
    • Walrus Operator in Python
    • Match-Case in Python
    • 📝 Assignments
  • Python Standard Library
    • Collections Module
    • Itertools Module
    • Functools Module
    • Datetime Module
    • JSON Module
    • OS Module
    • Sys Module
    • Random Module
    • Math Module
    • 📝 Assignments
  • Python Testing
    • Unit Testing in Python
    • Pytest Framework
    • Mocking in Python
    • 📝 Assignments
  • Python Best Practices
    • PEP 8 Style Guide
    • Docstrings in Python
    • Logging in Python
    • Code Optimization Tips
    • Debugging Techniques
    • 📝 Assignments
  • MySQL Database in Python
    • Introduction to MySQL with Python
    • DBMS vs File System
    • Connecting to MySQL Database
    • Create Database in MySQL
    • Create Table in MySQL
    • Insert Data in MySQL
    • Insert Multiple Rows
    • Select Data from MySQL
    • WHERE Clause in MySQL
    • Update Data in MySQL
    • Delete Data from MySQL
    • Parameterized Queries
    • Transaction Management
    • Error Handling
    • Connection Pooling
    • MySQL Drivers Guide
    • Joins in MySQL
    • Aggregation Functions
    • Backup MySQL Database
    • Best Practices
    • 📝 Assignments
  • MySQL Database Operations
    • SELECT Statement
    • MySQL Operators
    • DDL Statements
    • DML Statements
    • Subqueries
    • JOIN Operations
    • Aggregation
    • Case Study
    • 📝 Assignments
  • Graphics in Python
  • Threads in Python
    • Introduction to Threads
    • Process vs Threads
    • Concurrent Programming & GIL
    • Uses of Threads
    • Creating Threads
    • Single Tasking
    • Multi Tasking
    • Thread Synchronization
    • 📝 Assignments
  • Interview Questions & Answers
  • Python Case Studies
  • Multiple Choice Questions
  • 📝 Practice Problems
Get in Touch
  • tech2dsm@gmail.com

© Sankalan Data Tech

Python Language Interactive Tutorial

Python: Basics of Object-Oriented Programming

Python OOP Basics - Complete Guide

Learn the fundamentals of Object-Oriented Programming in Python — a powerful way to structure your code.

Created by Sankalan Data Tech Team Verified
Data Engineers, Analysts, Scientists & Trainers
Created by experienced Python developers, data engineers, and data scientists to make programming easy through practical examples, real-world experience, and clear explanations.
On this page:
  • What is Object-Oriented Programming?
  • Why OOP? The Problem It Solves
  • Classes: The Blueprint
  • Objects: The Real Things
  • Attributes: What Objects Know
  • Methods: What Objects Do
  • The Four Pillars of OOP
  • A Complete Example
  • Try It Yourself
  • Quick Quiz
  • Frequently Asked Questions
Share this tutorial:
Twitter LinkedIn Facebook WhatsApp Reddit Telegram Email Copy Link
What You'll Learn Here
  • What is OOP — understanding the object-oriented paradigm
  • Why OOP — the problems OOP solves
  • Classes and Objects — blueprints and real things
  • Attributes and Methods — what objects know and do
  • The Four Pillars — encapsulation, inheritance, polymorphism, abstraction
  • Real-world examples — seeing OOP in action

What is Object-Oriented Programming?

Object-Oriented Programming, or OOP for short, is a way of writing code that organizes data and behavior together into objects. Instead of thinking about your program as a list of instructions, you think about it as a collection of objects that interact with each other.

Definition: Object-Oriented Programming is a programming paradigm that uses "objects" — which contain both data (attributes) and behavior (methods) — to model real-world things and relationships.

Think of OOP like building with LEGO bricks. Each brick is a self-contained object with its own properties (color, size) and capabilities (can connect to other bricks). You build complex structures by combining these simple objects. This is much easier than trying to build everything from scratch.

In Python, everything is an object — even numbers, strings, and lists. OOP is not just a feature of Python; it's how Python is designed at its core. Understanding OOP is essential for writing clean, organized, and maintainable Python code.

💡 Key concept: OOP is a programming style that models real-world entities as objects. Each object has data (what it knows) and behavior (what it can do). This makes code more intuitive, reusable, and easier to maintain.

Why OOP? The Problem It Solves

1

Understanding the Need for OOP

To understand why OOP is valuable, let's think about how we would model a complex system without it. Imagine you're building a program to manage a library. You have books, members, and loans. In a non-OOP (procedural) approach, you'd have separate data structures and functions that operate on them:

# Procedural approach (without OOP)
# Data stored in separate structures
books = []
members = []
loans = []

# Functions that operate on the data
def add_book(title, author):
    books.append({"title": title, "author": author})

def borrow_book(book_id, member_id):
    # Complex logic to handle borrowing
    pass

def return_book(loan_id):
    # Complex logic to handle returns
    pass

# The problem: as the system grows, it becomes messy.
# Data and logic are separated, making it hard to maintain.
# You have to remember which functions work with which data.
# Adding new features often means changing many parts of the code.
                                

Now compare this with an OOP approach. In OOP, we would create a Book class that holds all the data about a book and the operations you can do with it. A Member class would handle member-related data and actions. A Loan class would manage the borrowing process.

The key difference is organization — related data and behavior are kept together. This makes the code easier to understand, modify, and extend. It also makes it easier to work in teams, as different developers can work on different classes.

Why OOP matters:

  • Organization — related code is grouped together
  • Reusability — classes can be used in multiple projects
  • Maintainability — changes in one class don't affect others
  • Scalability — easier to add new features
  • Collaboration — teams can work on different classes
  • Real-world modeling — code mirrors how we think about things

Quick Check: What is the main problem OOP solves? (Answer: It organizes related data and behavior together, making code easier to manage)

Classes: The Blueprint

2

Understanding the Concept of Classes

A class is like a blueprint or a template for creating objects. It defines the structure and behavior that all objects of that type will have. Think of a class like the blueprint for a house — it specifies what the house will look like, how many rooms it will have, and what features it will include. But the blueprint itself is not a house.

Definition: A class is a user-defined blueprint or prototype from which objects are created. It defines a set of attributes (data) and methods (functions) that characterize any object that is created from it.

# Defining a simple class
class Dog:
    """A simple Dog class"""
    
    # The __init__ method is called when an object is created
    def __init__(self, name, age):
        """Initialize the dog's attributes"""
        self.name = name  # Attribute: name
        self.age = age    # Attribute: age
    
    # A method (behavior)
    def bark(self):
        """Make the dog bark"""
        return f"{self.name} says Woof!"

    # Another method
    def get_info(self):
        """Get information about the dog"""
        return f"{self.name} is {self.age} years old"

# The class is just a blueprint.
# No dog has been created yet.
# We'll create actual dogs (objects) in the next section.
                                

In the example above, Dog is a class. It defines what a dog object should look like. Every dog will have a name and an age, and every dog will be able to bark() and provide get_info(). But the class itself is just a definition — it's not a dog.

Key points about classes:

  • Blueprint — defines what objects will look like
  • No objects yet — just a definition
  • Attributes — the data that objects will hold
  • Methods — the behaviors that objects will have
  • __init__ — the constructor, called when an object is created
  • self — refers to the specific instance of the class

Quick Check: What is a class? (Answer: A blueprint or template for creating objects)

Objects: The Real Things

3

Creating and Using Objects

An object is an instance of a class. It's the actual thing that exists in memory, with its own data and behavior. If a class is the blueprint, an object is the house built from that blueprint.

Definition: An object is a specific instance of a class. It has its own set of attribute values and can perform the methods defined in its class.

# Creating objects from the Dog class

# First, let's define the class again
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def bark(self):
        return f"{self.name} says Woof!"
    
    def get_info(self):
        return f"{self.name} is {self.age} years old"

# Now, let's create some dogs (objects)
buddy = Dog("Buddy", 3)        # First dog object
max = Dog("Max", 5)            # Second dog object
bella = Dog("Bella", 2)        # Third dog object

# Each dog is a separate object with its own data
print(buddy.get_info())        # Buddy is 3 years old
print(max.get_info())          # Max is 5 years old
print(bella.get_info())        # Bella is 2 years old

# Each dog can perform the same behaviors
print(buddy.bark())            # Buddy says Woof!
print(max.bark())              # Max says Woof!
print(bella.bark())            # Bella says Woof!

# Objects are independent
# Changing one doesn't affect others
buddy.age = 4
print(buddy.get_info())        # Buddy is 4 years old
print(max.get_info())          # Max is still 5 years old (unchanged)
                                

Notice that buddy, max, and bella are all separate objects. They each have their own name and age values. They can all perform the same actions (bark(), get_info()), but they do so with their own data. This is the essence of OOP — objects are self-contained units that combine data and behavior.

Key points about objects:

  • Instance — a specific occurrence of a class
  • Own data — each object has its own attribute values
  • Same behavior — all objects of a class share the same methods
  • Independent — changes to one object don't affect others
  • Created with class name — like Dog("Buddy", 3)

Quick Check: What is an object? (Answer: A specific instance of a class)

Attributes: What Objects Know

4

Understanding Attributes

Attributes are the data stored inside an object. They represent the state or characteristics of the object. For a dog, attributes might include its name, age, breed, and color. For a car, attributes might include its make, model, year, and color.

Definition: Attributes are variables that belong to an object. They hold the data that defines the object's state. Attributes are accessed using dot notation (object.attribute).

class Car:
    def __init__(self, make, model, year, color):
        # These are instance attributes
        self.make = make
        self.model = model
        self.year = year
        self.color = color
        self.mileage = 0  # Default value
    
    def drive(self, miles):
        self.mileage += miles
        return f"Drove {miles} miles. Total mileage: {self.mileage}"

# Creating a car object
my_car = Car("Toyota", "Camry", 2022, "Blue")

# Accessing attributes
print(f"Make: {my_car.make}")      # Toyota
print(f"Model: {my_car.model}")    # Camry
print(f"Year: {my_car.year}")      # 2022
print(f"Color: {my_car.color}")    # Blue
print(f"Mileage: {my_car.mileage}") # 0

# Modifying attributes
my_car.color = "Red"
print(f"New color: {my_car.color}") # Red

# Using methods that update attributes
my_car.drive(100)   # Drove 100 miles. Total mileage: 100
my_car.drive(50)    # Drove 50 miles. Total mileage: 150
                                

Attributes can be set when the object is created (in the __init__ method), or they can be added or changed later. They can also have default values, as shown with mileage = 0.

Types of attributes:

  • Instance attributes — belong to each object individually
  • Class attributes — belong to the class itself (shared by all objects)
  • Set in __init__ — initialized when object is created
  • Can be modified — attributes can change over time
  • Access with dot — object.attribute

Quick Check: What are attributes? (Answer: The data stored inside an object)

Methods: What Objects Do

5

Understanding Methods

Methods are functions that belong to an object. They define the behavior of the object — what it can do. For a dog, methods might include bark(), eat(), and sleep(). For a car, methods might include drive(), stop(), and refuel().

Definition: Methods are functions defined inside a class that describe the behaviors of objects. They can access and modify the object's attributes.

class BankAccount:
    def __init__(self, account_number, balance=0):
        self.account_number = account_number
        self.balance = balance
    
    # Deposit method
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            return f"Deposited ${amount}. New balance: ${self.balance}"
        else:
            return "Invalid deposit amount"
    
    # Withdraw method
    def withdraw(self, amount):
        if amount > 0 and amount <= self.balance:
            self.balance -= amount
            return f"Withdrew ${amount}. New balance: ${self.balance}"
        elif amount > self.balance:
            return f"Insufficient funds. Balance: ${self.balance}"
        else:
            return "Invalid withdrawal amount"
    
    # Check balance method
    def check_balance(self):
        return f"Account {self.account_number} balance: ${self.balance}"

# Creating and using a bank account
account = BankAccount("123456", 1000)

# Using methods
print(account.deposit(500))      # Deposited $500. New balance: $1500
print(account.withdraw(200))     # Withdrew $200. New balance: $1300
print(account.check_balance())   # Account 123456 balance: $1300
print(account.withdraw(2000))    # Insufficient funds. Balance: $1300
                                

Methods are where the real work happens in OOP. They define the behaviors of objects and often modify the object's attributes. The first parameter of a method is always self, which refers to the specific object that the method is being called on.

Key points about methods:

  • Behavior — define what objects can do
  • Self — refers to the current object
  • Can access attributes — use self.attribute
  • Can modify attributes — change object state
  • Can accept parameters — like regular functions
  • Can return values — like regular functions

Quick Check: What is a method? (Answer: A function that belongs to an object and defines its behavior)

The Four Pillars of OOP

6

Encapsulation, Inheritance, Polymorphism, and Abstraction

Object-Oriented Programming is built on four fundamental concepts, often called the "Four Pillars." These concepts are what make OOP powerful and are the key to understanding how to design good object-oriented systems.

1. Encapsulation — The idea of bundling data and methods that work on that data within a single unit (a class). It also involves restricting direct access to some of an object's components, which is why we have private and protected attributes.

# Example of Encapsulation
class Person:
    def __init__(self, name, age):
        self.name = name
        # The age is "protected" (by convention, use _ to indicate)
        self._age = age
    
    # Getter method to access age
    def get_age(self):
        return self._age
    
    # Setter method to modify age with validation
    def set_age(self, age):
        if age > 0:
            self._age = age
            return "Age updated"
        else:
            return "Invalid age"

# Using the class
person = Person("Alice", 25)

# Direct access is discouraged (but still possible in Python)
print(person.get_age())  # 25

# The setter provides validation
person.set_age(30)       # Age updated
print(person.get_age())  # 30

# Encapsulation protects data and controls how it's accessed
                                

2. Inheritance — The mechanism by which one class can inherit attributes and methods from another class. This allows you to create a hierarchy of classes, where child classes extend the functionality of parent classes.

# Example of Inheritance
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        return "Some sound"

# Dog inherits from Animal
class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

# Cat inherits from Animal
class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

# Using inheritance
dog = Dog("Buddy")
cat = Cat("Whiskers")

print(dog.speak())  # Buddy says Woof!
print(cat.speak())  # Whiskers says Meow!

# Dog and Cat share the name attribute from Animal
# but have their own speak() implementation
                                

3. Polymorphism — The ability to use a common interface for different types. In other words, the same method name can behave differently for different object types. In the example above, speak() behaves differently for Dog and Cat.

# Example of Polymorphism
def make_animal_speak(animal):
    # This function works with any animal that has a speak() method
    print(animal.speak())

# Both Dog and Cat can be passed to the function
dog = Dog("Buddy")
cat = Cat("Whiskers")

make_animal_speak(dog)  # Buddy says Woof!
make_animal_speak(cat)  # Whiskers says Meow!

# The same function works with different types
# This is polymorphism in action
                                

4. Abstraction — The concept of hiding complex implementation details and showing only the essential features. It allows you to focus on what an object does rather than how it does it. In the BankAccount example, you don't need to know how the balance is calculated internally; you just use deposit() and withdraw().

# Example of Abstraction
class CoffeeMachine:
    def __init__(self):
        self._water = 1000  # in ml
        self._coffee = 500  # in grams
    
    def make_coffee(self, cups):
        # The user doesn't need to know the internal details
        if self._water >= cups * 200 and self._coffee >= cups * 20:
            self._water -= cups * 200
            self._coffee -= cups * 20
            return f"Made {cups} cups of coffee"
        else:
            return "Not enough resources"

# The user just calls make_coffee()
machine = CoffeeMachine()
print(machine.make_coffee(2))  # Made 2 cups of coffee

# The internal details (water, coffee levels) are hidden
# The user only needs to know the method name
                                

The Four Pillars:

  • Encapsulation — bundling data and methods, controlling access
  • Inheritance — creating class hierarchies, code reuse
  • Polymorphism — same interface, different behavior
  • Abstraction — hiding complexity, showing only what's needed

Quick Check: What are the four pillars of OOP? (Answer: Encapsulation, Inheritance, Polymorphism, and Abstraction)

A Complete Example

7

Bringing It All Together

Let's build a complete example that demonstrates all the concepts we've learned — classes, objects, attributes, methods, and the four pillars of OOP.

# A complete example: A Library Management System

class Book:
    """Represents a book in the library"""
    def __init__(self, title, author, isbn):
        self.title = title
        self.author = author
        self.isbn = isbn
        self.is_borrowed = False
    
    def borrow(self):
        if not self.is_borrowed:
            self.is_borrowed = True
            return f"'{self.title}' has been borrowed"
        else:
            return f"'{self.title}' is already borrowed"
    
    def return_book(self):
        if self.is_borrowed:
            self.is_borrowed = False
            return f"'{self.title}' has been returned"
        else:
            return f"'{self.title}' was not borrowed"
    
    def get_info(self):
        status = "Borrowed" if self.is_borrowed else "Available"
        return f"'{self.title}' by {self.author} - {status}"

class Member:
    """Represents a library member"""
    def __init__(self, name, member_id):
        self.name = name
        self.member_id = member_id
        self.borrowed_books = []
    
    def borrow_book(self, book):
        if len(self.borrowed_books) >= 3:
            return f"{self.name} has reached the borrowing limit"
        
        result = book.borrow()
        if "borrowed" in result:
            self.borrowed_books.append(book)
        return result
    
    def return_book(self, book):
        if book in self.borrowed_books:
            self.borrowed_books.remove(book)
            return book.return_book()
        else:
            return f"{self.name} did not borrow '{book.title}'"
    
    def get_info(self):
        books = [book.title for book in self.borrowed_books]
        return f"{self.name} (ID: {self.member_id}) - Borrowed: {books}"

class Library:
    """Represents the library system"""
    def __init__(self, name):
        self.name = name
        self.books = []
        self.members = []
    
    def add_book(self, book):
        self.books.append(book)
        return f"Added '{book.title}' to the library"
    
    def register_member(self, member):
        self.members.append(member)
        return f"Registered {member.name} as a member"
    
    def find_book(self, title):
        for book in self.books:
            if book.title.lower() == title.lower():
                return book
        return None
    
    def find_member(self, name):
        for member in self.members:
            if member.name.lower() == name.lower():
                return member
        return None
    
    def display_books(self):
        print(f"\nBooks in {self.name}:")
        for book in self.books:
            print(f"  {book.get_info()}")

# === Using the system ===

# Create the library
library = Library("City Library")

# Create books
book1 = Book("The Python Guide", "John Smith", "123-456-7890")
book2 = Book("Data Science 101", "Jane Doe", "098-765-4321")
book3 = Book("Web Development", "Bob Johnson", "111-222-3333")

# Add books to the library
library.add_book(book1)
library.add_book(book2)
library.add_book(book3)

# Create members
member1 = Member("Alice", "M001")
member2 = Member("Bob", "M002")

# Register members
library.register_member(member1)
library.register_member(member2)

# Display books
library.display_books()

# Borrow books
print("\n--- Borrowing Books ---")
print(member1.borrow_book(book1))
print(member1.borrow_book(book2))
print(member2.borrow_book(book1))  # Already borrowed

# Display updated info
print(f"\n{member1.get_info()}")
print(f"{member2.get_info()}")

# Return a book
print("\n--- Returning Books ---")
print(member1.return_book(book1))

# Final status
print(f"\n{member1.get_info()}")
library.display_books()
                                

What this example demonstrates:

  • Classes — Book, Member, Library
  • Objects — instances of each class
  • Attributes — title, author, name, borrowed_books
  • Methods — borrow(), return_book(), get_info()
  • Encapsulation — each class manages its own data
  • Inheritance — (could be extended with subclasses)
  • Polymorphism — different objects with similar interfaces
  • Abstraction — users interact with high-level methods

Quick Check: What are the four pillars of OOP demonstrated in this example? (Answer: Encapsulation, Inheritance, Polymorphism, and Abstraction)

Try It Yourself

Experiment with Object-Oriented Programming in the editor below. Try creating your own classes and objects.

Loading Pyodide... 0%
Python Code Editor
========================================
OOP BASICS PRACTICE
========================================

1. CREATING A CLASS

2. CREATING OBJECTS
Hi, I'm Alice and I'm in grade 10
Hi, I'm Bob and I'm in grade 9

3. USING METHODS
Alice is now in grade 11
Bob is now in grade 10

4. ACCESSING ATTRIBUTES
Alice's name: Alice
Bob's grade: 10

5. MULTIPLE OBJECTS
Hi, I'm Charlie and I'm in grade 12
Hi, I'm Diana and I'm in grade 11
Hi, I'm Eve and I'm in grade 10

OOP basics practice complete!
🏆

You've Got It!

You now understand the basics of Object-Oriented Programming in Python. You know what classes and objects are, how to create them, and the four pillars of OOP. This is the foundation for all advanced OOP topics!

Quick Quiz

Test what you've learned:

1. What is a class in Python?
2. What is an object?
3. What is encapsulation?
4. What is inheritance?
5. What is polymorphism?

Frequently Asked Questions

What is the difference between a class and an object? ▼

A class is a blueprint or template that defines the structure and behavior of objects. An object is an instance of a class — a specific entity created from the blueprint. A class defines what objects will look like; an object is the actual thing in memory. For example, Dog is a class, and buddy = Dog("Buddy", 3) creates an object.

What is the difference between attributes and methods? ▼

Attributes are the data that belongs to an object — they represent the state or characteristics of the object (e.g., name, age, color). Methods are the behaviors of an object — they are functions that can access and modify attributes (e.g., bark(), drive(), deposit()).

What is the purpose of the __init__ method? ▼

The __init__ method is the constructor in Python classes. It's called automatically when an object is created. Its purpose is to initialize the object's attributes with values. It sets up the initial state of the object. Think of it as the instructions for setting up a new object.

What's a common interview question about OOP? ▼

Common questions include: "What is the difference between a class and an object?" "Explain the four pillars of OOP," "What is the difference between inheritance and polymorphism?" and "What is encapsulation and why is it important?"

What is the difference between class and instance attributes? ▼

Class attributes are defined at the class level and are shared by all instances of the class. They are the same for every object. Instance attributes are defined in the __init__ method and belong to each object individually. Each object has its own copy of instance attributes.

Why should I use OOP in Python? ▼

OOP helps you write organized, reusable, and maintainable code. It models real-world relationships, makes code easier to understand, and helps manage complexity in large programs. Python is designed to support OOP, and many Python libraries and frameworks use OOP concepts.

Where to Go From Here

Now that you understand the basics of OOP, check out these related topics:

What are Classes and Objects?

Dive deeper into classes and objects with more examples.

Learn More →

OOP vs Procedural Programming

Understand the differences between OOP and procedural programming.

Learn More →

Inheritance

Learn how to create class hierarchies with inheritance.

Learn More →
Interview Resources
  • Python Syntax & Variables Interview Questions
  • Top SQL Interview Questions & Answers
  • SQL Joins: Displaying Data from Multiple Tables FAQ
  • Python Lists and Dictionaries Interview Questions
  • Python OOP Interview Questions
  • SQL Set Operators Interview Questions
Previous: Regular Expressions Next: What are Classes and Objects? →