Object-Oriented Programming (OOP): Classes, Objects, and Dataclasses

Welcome to Cyber Supto! I'm Supto.

As Python projects grow larger and more complex, writing everything using simple scripts and functions becomes difficult to manage. This is where Object-Oriented Programming (OOP) becomes extremely useful.

OOP allows developers to organize code into reusable structures called classes and objects. Instead of writing scattered functions, we design structured components that represent real-world entities.

In this guide, we will explore the fundamentals of Python OOP, including:

  • Classes and objects
  • Constructors
  • Instance variables and methods
  • Encapsulation
  • Dataclasses for modern Python development

By the end of this article, you will understand how professional Python developers structure applications using OOP.


What is Object-Oriented Programming?

Object-Oriented Programming (OOP) is a programming paradigm that organizes code around objects rather than functions.

An object represents a real-world entity with:

  • Attributes (data)
  • Methods (behavior or actions)

For example, imagine a User in an application:

Component Example
Object User
Attributes name, email, age
Methods login(), logout()

OOP helps developers build scalable systems where code is organized into logical units.


Understanding Classes

A class is a blueprint for creating objects.

Think of a class like a template that defines what attributes and behaviors an object will have.

class User:
    pass

This defines an empty class named User.

Classes usually contain:

  • Attributes (variables)
  • Methods (functions inside a class)

Creating Objects

An object is an instance of a class.

Example:

class User:
    pass

user1 = User()
user2 = User()

print(user1)
print(user2)

Each object created from a class is independent.

Even though they come from the same class, they can store different data.


The Constructor Method (__init__)

Python classes typically use a constructor called __init__().

This method runs automatically when an object is created.

It is used to initialize object attributes.

class User:

    def __init__(self, name, email):
        self.name = name
        self.email = email

user1 = User("Supto", "supto@email.com")

print(user1.name)
print(user1.email)

Output:

Supto
supto@email.com

Understanding "self"

The self keyword refers to the current object instance.

It allows each object to maintain its own data.

Concept Explanation
self.name Attribute belonging to the object
self.email Unique data stored inside each object

Instance Methods

Methods are functions defined inside a class that describe object behavior.

class User:

    def __init__(self, name):
        self.name = name

    def greet(self):
        print("Hello,", self.name)

user = User("Supto")
user.greet()

Output:

Hello, Supto

Methods make classes powerful because they combine both data and functionality.


Class Attributes vs Instance Attributes

Python classes can have two types of attributes.

Attribute Type Description Example
Instance Attribute Unique for each object self.name
Class Attribute Shared across all objects platform = "Cyber Supto"

Example:

class User:

    platform = "Cyber Supto"

    def __init__(self, name):
        self.name = name

u1 = User("Supto")
u2 = User("Alex")

print(u1.platform)
print(u2.platform)

Both objects share the same class attribute.


Encapsulation in Python

Encapsulation means restricting direct access to some object data.

This helps protect internal state and prevents accidental modification.

Python uses naming conventions:

Visibility Example Meaning
Public name Accessible anywhere
Protected _name Internal use recommended
Private __name Name-mangled
Example:
class BankAccount:

    def __init__(self, balance):
        self.__balance = balance

    def show_balance(self):
        print(self.__balance)

account = BankAccount(5000)
account.show_balance()

Introduction to Dataclasses

Python introduced dataclasses to simplify class creation for data storage.

Dataclasses automatically generate:

  • __init__()
  • __repr__()
  • __eq__()

This reduces boilerplate code significantly.


Creating a Dataclass

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int
    country: str

user = User("Supto", 21, "Bangladesh")

print(user)

Output:

User(name='Supto', age=21, country='Bangladesh')

Notice how we didn’t need to manually define an __init__() method.


Benefits of Using Dataclasses

  • Less boilerplate code
  • Automatic constructor generation
  • Improved readability
  • Better debugging representation
  • Ideal for data-heavy applications

Regular Class vs Dataclass

Feature Regular Class Dataclass
Constructor Manual Auto generated
Readability More verbose Cleaner syntax
Best Use Complex logic Data containers

Real-World Example

Imagine building a simple blog user system.

from dataclasses import dataclass

@dataclass
class BlogUser:
    username: str
    posts: int
    followers: int

user = BlogUser("CyberSupto", 12, 540)

print(user.username)
print(user.posts)

This structure makes it easy to store and manage structured data.


Best Practices for Python OOP

  • Keep classes focused on a single responsibility
  • Use dataclasses for pure data structures
  • Write descriptive method names
  • Avoid overly complex class hierarchies
  • Use encapsulation for sensitive data

Frequently Asked Questions (FAQ)

What is OOP in Python?

Object-Oriented Programming organizes code using classes and objects to create reusable and scalable software.

What is the difference between a class and an object?

A class is a blueprint, while an object is an instance created from that blueprint.

What is a dataclass in Python?

A dataclass is a special class introduced in Python to automatically generate common methods like __init__ and __repr__.

Should I always use dataclasses?

No. Dataclasses are best for storing structured data, but complex logic-based systems often require regular classes.

Is OOP necessary in Python?

Small scripts may not require OOP, but large applications benefit greatly from structured object-oriented design.


Conclusion

Object-Oriented Programming is a fundamental skill for modern Python developers. By organizing code using classes and objects, you can build scalable, maintainable, and reusable software systems.

Python’s support for dataclasses further simplifies structured programming by reducing repetitive boilerplate code.

Mastering OOP concepts like classes, objects, methods, and dataclasses will significantly improve the quality and structure of your Python applications.

Thanks for reading on Cyber Supto. I'm Supto.

Keep learning, keep building, and keep exploring the power of Python.