---
title: Object-Oriented Programming (OOP) in Python
date: 2026-01-03T18:25:40Z
modified: 2026-01-04T20:09:26Z
permalink: "https://www.micheledpierri.com/python/oop/"
type: page
status: publish
excerpt: ""
wpid: 2513
featured_image: "https://www.micheledpierri.com/wp-content/uploads/2026/01/Python_10.webp"
featured_image_alt: Children dressed in lab coats are studying a python
timestamp: 2026-01-04T20:09:26Z
tags: []
---

##  Lesson Objectives

By the end of this lesson, you will be able to:

- Understand what Object-Oriented Programming is
- Define and use classes and objects
- Work with attributes and methods
- Recognize when OOP is useful in analytical and ML code

This lesson introduces **structure at scale**:

from scripts and functions to **cohesive software components**.

---

## 1️⃣ What Is Object-Oriented Programming

Object-Oriented Programming (OOP) is a programming paradigm based on:

- **objects** → entities that combine data and behavior
- **classes** → blueprints for creating objects

Instead of passing data through many functions,

you group **data + logic** together.

---

## 2️⃣ Classes and Objects

### Defining a Class

class Person:
    pass

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Person</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">pass</span></span>
<span class="line"></span>
<span class="line"></span>
```

- `class` defines a new type
- `Person` is the class name (CamelCase by convention)

Creating an object (instance):

p = Person()

```
<span class="line"><span style="color: #F8F8F2">p </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Person()</span></span>
<span class="line"></span>
<span class="line"></span>
```

`p` is now an object of type `Person`.

---

## 3️⃣ The `__init__` Method (Constructor)

The `__init__` method runs when an object is created.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Person</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">name</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">age</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.name </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> name</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.age </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> age</span></span>
<span class="line"></span>
<span class="line"></span>
```

Creating an instance:

p = Person("Michele", 40)

```
<span class="line"><span style="color: #F8F8F2">p </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Person(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Michele</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">40</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Here:

- `self` refers to the current object
- attributes are attached to the object

---

## 4️⃣ Instance Attributes

Attributes store data **inside the object**.

print(p.name)
print(p.age)

```
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(p.name)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(p.age)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Each object has its own state:

p2 = Person("Anna", 35)

```
<span class="line"><span style="color: #F8F8F2">p2 </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Person(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Anna</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">35</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

`p` and `p2` are independent.

---

## 5️⃣ Methods (Object Behavior)

Methods are functions defined inside a class.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name}"

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Person</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">name</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">age</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.name </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> name</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.age </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> age</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">greet</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Hello, my name is </span><span style="color: #BD93F9">{</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.name</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span></span>
<span class="line"></span>
<span class="line"></span>
```

Calling a method:

p.greet()

```
<span class="line"><span style="color: #F8F8F2">p.greet()</span></span>
<span class="line"></span>
<span class="line"></span>
```

Methods operate on the object’s internal data.

---

## 6️⃣ Why `self` Exists

`self` represents **the current instance**.

When you write:

p.greet()

```
<span class="line"><span style="color: #F8F8F2">p.greet()</span></span>
<span class="line"></span>
<span class="line"></span>
```

Python translates it internally to:

Person.greet(p)

```
<span class="line"><span style="color: #F8F8F2">Person.greet(p)</span></span>
<span class="line"></span>
<span class="line"></span>
```

This is why `self` must always be the first parameter.

---

## 7️⃣ OOP vs Functions (When to Use What)

### Use functions when:

- logic is simple
- data flows linearly
- no persistent state is needed

### Use classes when:

- data and behavior belong together
- state must be preserved
- complexity grows

In data science:

- functions → transformations
- classes → models, datasets, pipelines

---

## 8️⃣ Simple Analytical Example

class Patient:
    def __init__(self, age, bmi):
        self.age = age
        self.bmi = bmi

    def risk_score(self):
        return self.age * self.bmi

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Patient</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">age</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">bmi</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.age </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> age</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.bmi </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> bmi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">risk_score</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.age </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.bmi</span></span>
<span class="line"></span>
<span class="line"></span>
```

Usage:

patient = Patient(65, 28.5)
patient.risk_score()

```
<span class="line"><span style="color: #F8F8F2">patient </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Patient(</span><span style="color: #BD93F9">65</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">28.5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">patient.risk_score()</span></span>
<span class="line"></span>
<span class="line"></span>
```

This pattern mirrors real analytical models.

---

## 9️⃣ Common Beginner Mistakes

### Forgetting `self`

def greet():
    return "Hello"

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">greet</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Hello</span><span style="color: #E9F284">"</span></span>
<span class="line"></span>
<span class="line"></span>
```

This is not a method.

### Putting logic outside the class

score = patient.age * patient.bmi

```
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> patient.age </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> patient.bmi</span></span>
<span class="line"></span>
<span class="line"></span>
```

Better encapsulated as a method.

---

## FAQ — Frequently Asked Questions

**Q: Is OOP mandatory in Python?**

A: No, but it becomes very useful as complexity increases.

**Q: Is OOP slow?**

A: No. Design quality matters more than micro-performance.

**Q: Should I always use classes in data analysis?**

A: No. Use them when structure and state are needed.

**Q: What about inheritance?**

A: Important, but intentionally postponed to advanced topics.

---

## Exercises

### Exercise 1

Define an empty class called `Car`.

### Exercise 2

Create an object of class `Car`.

### Exercise 3

Add an `__init__` method with attributes `brand` and `year`.

### Exercise 4

Create an instance of `Car`.

### Exercise 5

Access the attributes of the object.

### Exercise 6

Add a method `age()` that returns the car’s age.

### Exercise 7

Predict the output:

class A:
    def __init__(self, x):
        self.x = x

a = A(5)
print(a.x)

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">A</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.x </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> x</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">a </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> A(</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(a.x)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 8

Explain why `self` is required.

### Exercise 9

Write a simple class representing a dataset with a size attribute.

### Exercise 10

Explain when OOP is useful in data analysis.

---

## Solutions

### Exercise 1

class Car:
    pass

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Car</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">pass</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 2

c = Car()

```
<span class="line"><span style="color: #F8F8F2">c </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Car()</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 3

class Car:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Car</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">brand</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">year</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.brand </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> brand</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.year </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> year</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 4

c = Car("Toyota", 2020)

```
<span class="line"><span style="color: #F8F8F2">c </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> Car(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Toyota</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2020</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 5

print(c.brand)
print(c.year)

```
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(c.brand)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(c.year)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 6

class Car:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year

    def age(self, current_year):
        return current_year - self.year

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Car</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">brand</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">year</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.brand </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> brand</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.year </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> year</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">age</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">current_year</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> current_year </span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.year</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 7

# Output: 5

```
<span class="line"><span style="color: #6272A4"># Output: 5</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 8

# It refers to the current object instance

```
<span class="line"><span style="color: #6272A4"># It refers to the current object instance</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 9

class Dataset:
    def __init__(self, n_rows):
        self.n_rows = n_rows

```
<span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Dataset</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">n_rows</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #BD93F9; font-style: italic">self</span><span style="color: #F8F8F2">.n_rows </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> n_rows</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 10

# OOP groups data and behavior, improving structure and reuse

```
<span class="line"><span style="color: #6272A4"># OOP groups data and behavior, improving structure and reuse</span></span>
<span class="line"></span>
<span class="line"></span>
```

---

## Next Lesson Preview

In **Lesson 11**, we will cover:

- list comprehensions
- lambda functions
- `args` and `*kwargs`
- a first look at “Pythonic” code

## This lesson will complete the transition from **beginner to intermediate**. **systems**.