4.11 Classes and Objects
Table of Contents
Why Classes and Objects Matter
In backend development you often need to represent real world things in code: users, orders, products, payments, emails, and more. Classes and objects are how most programming languages model these things.
You will learn the general ideas here. Later, in the “Object-Oriented Programming” and “Python” chapters, you will see language specific details and more advanced concepts.
Think of this chapter as a gentle first pass over the basics.
From Data To “Things”
So far you may have used only simple data types:
- Numbers:
10,3.14 - Strings:
"hello","user@example.com" - Booleans:
true,false - Lists or arrays:
[1, 2, 3]
These are useful, but real backend data usually has structure.
Example: You want to handle a user in a system.
Using only basic types, you might write:
user_id = 1
user_name = "Alice"
user_email = "alice@example.com"
user_is_active = TrueIf you need two users:
user1_id = 1
user1_name = "Alice"
user1_email = "alice@example.com"
user1_is_active = True
user2_id = 2
user2_name = "Bob"
user2_email = "bob@example.com"
user2_is_active = FalseThis is messy and error prone. You have many related variables floating around with no clear relationship. Functions that work with “a user” will need many parameters.
Classes and objects fix this problem by letting you group data and behavior into a single “thing”.
What Is a Class?
A class is a blueprint or template that describes:
- What data a type of object should have (fields, also called attributes or properties).
- What actions that object can do (methods).
Analogy:
- A class is like a blueprint for a house.
- It defines how a house should look and what rooms it has.
- The blueprint itself is not a house, you cannot live in it.
Example of a User class in a Python-like pseudocode:
class User:
# This runs when you create a new user
def __init__(self, id, name, email, is_active):
self.id = id
self.name = name
self.email = email
self.is_active = is_active
def deactivate(self):
self.is_active = False
def activate(self):
self.is_active = TrueIn this example:
Useris the class name.- The class defines data:
id,name,email,is_active. - The class defines behavior: methods
deactivateandactivate.
You do not use User directly to represent a single user. Instead, you create objects from it.
What Is an Object?
An object (also called an instance of a class) is a concrete version of the class blueprint, with actual values.
Analogy:
- The blueprint is the class.
- A real house built from that blueprint is an object.
- You can have many houses built from the same blueprint.
Using the previous User class, you create objects like this:
alice = User(1, "Alice", "alice@example.com", True)
bob = User(2, "Bob", "bob@example.com", False)Now:
aliceandbobare objects.- Both have the same structure, but different data.
You can call methods on each object separately:
bob.activate() # Changes bob.is_active to True
alice.deactivate() # Changes alice.is_active to FalseThe key idea is that:
- A class defines what kind of thing something is.
- An object is one specific thing of that kind.
Classes Group Data and Behavior
The main power of classes is that they put related data and functions together.
Without a class, you might use separate functions:
def deactivate_user(user):
user["is_active"] = False
def activate_user(user):
user["is_active"] = True
user = {
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"is_active": True,
}
Here user is a dictionary or map, and the functions live somewhere else. You always need to pass user into the functions.
With a class, the same actions become methods of the object itself:
alice = User(1, "Alice", "alice@example.com", True)
alice.deactivate()
alice.activate()Now:
- The object carries both the data and the actions that make sense for it.
- You do not need to pass
aliceintodeactivate, because the method belongs toalice.
This is called encapsulation and is one of the central ideas in object oriented programming. You will cover it more in a later chapter, but for now remember:
Important: A class groups related data and behavior into a single unit, which makes code easier to understand and maintain.
Terminology: Fields, Attributes, Methods, Instances
Different languages use slightly different words, but they typically mean:
| Term | Meaning |
|---|---|
| Class | Blueprint that defines a new type of object |
| Object | A specific value created from a class |
| Instance | Another word for “object” of a class |
| Field | A piece of data stored in an object, sometimes called an attribute |
| Attribute | Often the same as field, data that belongs to an object |
| Method | A function defined inside a class that works on the object’s data |
| Constructor | Special method that sets up a new object when it is created |
You will see these terms used again and again in backend documentation and tutorials.
A Simple Backend Style Example
Imagine a simple API that manages tasks in a to do application. Each task has:
- An id
- A title
- A completed flag
- A due date
You can model this with a class:
class Task:
def __init__(self, id, title, due_date, completed=False):
self.id = id
self.title = title
self.due_date = due_date
self.completed = completed
def complete(self):
self.completed = True
def reopen(self):
self.completed = False
def rename(self, new_title):
self.title = new_titleCreate and use objects:
task1 = Task(1, "Write documentation", "2026-08-30")
task2 = Task(2, "Fix bug #123", "2026-08-29", completed=True)
task1.complete() # task1.completed becomes True
task2.rename("Fix login bug")
task2.reopen() # task2.completed becomes FalseThis models tasks in the same way you think about them in the real world. Each object represents a specific task, with its own life cycle.
Constructors and Initialization
Most object oriented languages have a constructor. This is a special function that runs when you create a new object.
In the pseudocode examples, __init__ played that role:
class User:
def __init__(self, id, name, email, is_active=True):
self.id = id
self.name = name
self.email = email
self.is_active = is_activeWhen you write:
user = User(1, "Alice", "alice@example.com")The constructor fills in the initial values. The object starts its life in a valid state.
In backend systems, you often get data from outside, for example from an HTTP request or from a database. Constructors help you turn that raw data into well structured objects.
Example: creating a user from JSON data:
json_data = {
"id": 1,
"name": "Alice",
"email": "alice@example.com",
}
user = User(
id=json_data["id"],
name=json_data["name"],
email=json_data["email"],
)Methods Use the Object’s Own Data
Methods are functions that automatically receive the object they belong to, usually named self or this depending on the language.
In this example:
class Product:
def __init__(self, name, price, tax_rate):
self.name = name
self.price = price
self.tax_rate = tax_rate
def total_price(self):
return self.price * (1 + self.tax_rate)When you call:
p = Product("Book", 10.0, 0.19)
print(p.total_price())
Inside total_price, the following happens:
selfrefers top.- So
self.priceis10.0andself.tax_rateis0.19. - The method uses those values to compute the result.
This pattern is very useful in backend code. For example:
- A
Cartobject might have acalculate_totalmethod. - An
Orderobject might have acancelmethod. - A
Sessionobject might have arefreshmethod.
The code for these actions stays with the data it acts on.
Classes in Backend Structure
In backend applications, classes are used almost everywhere. Some typical categories:
| Class kind | Backend example |
|---|---|
| Data model | User, Product, Order, Invoice, Session |
| Service | EmailService, PaymentService, AuthService |
| Controller/Handler | UserController, TaskApiHandler |
| Utility | PasswordHasher, TokenGenerator, Logger |
Later chapters about architecture and frameworks will show structured ways to use such classes. For now, you just need to be comfortable with the basic idea:
- You define a class for each important “thing” or “responsibility”.
- You create objects where you need concrete values.
Multiple Objects From One Class
One blueprint can create many objects, each with its own state.
Example with a Session class:
class Session:
def __init__(self, user_id):
self.user_id = user_id
self.is_valid = True
def invalidate(self):
self.is_valid = FalseNow you can have sessions for many users:
s1 = Session(user_id=1)
s2 = Session(user_id=2)
s3 = Session(user_id=3)
s2.invalidate()
print(s1.is_valid) # True
print(s2.is_valid) # False
print(s3.is_valid) # TrueAll three share the same structure and behavior, but each keeps its own data. This is exactly how real systems work: one type of thing, many actual instances of it.
Identity, State, Behavior
You can describe objects with three key words:
- Identity
- Which specific object is this in memory or in the system.
- Example: user with id 1 vs user with id 2.
- State
- The current values of its fields.
- Example:
is_active,email,namefor a user. - Behavior
- What the object can do, its methods.
- Example:
activate,deactivate,change_email.
In code:
class User:
def __init__(self, id, name, email, is_active=True):
self.id = id # identity (in database)
self.name = name # part of state
self.email = email # part of state
self.is_active = is_active
def change_email(self, new_email): # behavior
self.email = new_email
def deactivate(self): # behavior
self.is_active = False
Remember:
A class defines identity, state, and behavior for its objects.
An object is the combination of a specific identity, its current state, and its available behavior.
Example: Modeling an Order
Here is a more complete example to connect classes and objects to a realistic backend concept, an online order.
Requirements:
- An order has an id, a list of items, and a status.
- An item has a product name, quantity, and unit price.
- You can add items to the order.
- You can calculate the total price.
- You can mark the order as paid.
Pseudocode:
class OrderItem:
def __init__(self, product_name, quantity, unit_price):
self.product_name = product_name
self.quantity = quantity
self.unit_price = unit_price
def total_price(self):
return self.quantity * self.unit_price
class Order:
def __init__(self, id):
self.id = id
self.items = []
self.is_paid = False
def add_item(self, item):
self.items.append(item)
def total_amount(self):
total = 0
for item in self.items:
total += item.total_price()
return total
def mark_paid(self):
self.is_paid = TrueUse it like this:
order = Order(id=1001)
item1 = OrderItem("Book", 2, 10.0) # 2 * 10.0 = 20.0
item2 = OrderItem("Pen", 5, 1.5) # 5 * 1.5 = 7.5
order.add_item(item1)
order.add_item(item2)
print(order.total_amount()) # 27.5
order.mark_paid()
print(order.is_paid) # TrueHere you see:
- Two classes model two related concepts.
- Objects of
OrderItemare used inside anOrderobject. - Methods encapsulate the logic of calculation and state changes.
This style is very common in backend development.
When To Use Classes
You do not always need classes. For small scripts, simple functions and basic data types are enough.
Classes are useful when:
- You have a clear “thing” or entity in your domain.
Examples: user, order, task, session, token, payment, email message. - Multiple values always travel together.
Instead of passing many separate parameters, you pass one object. - You want to group behavior with the data it uses.
- You want to create many similar items that share the same structure.
You will get better at choosing when to use classes as you practice and as you see real backend code.
Summary
- A class is a blueprint for creating objects.
- An object (instance) is a concrete value with:
- State stored in fields or attributes.
- Behavior implemented as methods.
- Constructors initialize new objects with data, often from requests or databases.
- Classes help you model real world concepts in your backend, such as users, orders, and sessions.
- Many backend patterns and frameworks are built around classes and objects, so this concept is essential before you learn more advanced topics.
Views: 7
KAHIBARO