📝 Python

OOP: Program Like a World Builder 🌍

0
Author
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Published
03.04.2026
⏱️
Reading time
5 min
👁️
Views
114
🌱
Level
Beginner

Imagine: you’re building a zombie-apocalypse game. You need zombies, humans, weapons. Every zombie has a name, health points, and can attack. How do you organize all of that?

Option 1: Plain variables (nightmare)

zombie1_name = "Walker"
zombie1_health = 50
zombie1_speed = 2

zombie2_name = "Runner"
zombie2_health = 30
zombie2_speed = 5

# 100 zombies = 300 variables... 😱

Option 2: Classes (elegant)

class Zombie:
    def __init__(self, name, health, speed):
        self.name = name
        self.health = health
        self.speed = speed

# Create as many as you want!
z1 = Zombie("Walker", 50, 2)
z2 = Zombie("Runner", 30, 5)

Welcome to OOP — the world where you create your own data types! 🚀

🎯 What is OOP?

OOP = Object-Oriented Programming

Core idea: A program is a collection of objects that interact with each other.

The real world = objects

Look around: everything is made of objects!

  • 🚗 Car: has color, speed; can drive, brake
  • 🐕 Dog: has a name, age; can bark, run
  • 📱 Phone: has battery level, model; can call, take photos

OOP mirrors the real world in code!

🏗️ Two fundamental concepts

1. Class = Blueprint

A class is a template from which objects are created.

Analogy: a house blueprint 🏠
- The blueprint describes: number of rooms, window placement, roof type
- You can build 100 houses from one blueprint
- Each house is unique (different addresses, residents)

class Zombie:  # Blueprint for a zombie
    # Describe what every zombie should have
    pass

2. Object = Instance

An object is a concrete instance created from a class.

# Create objects (specific zombies)
walker = Zombie()  # First zombie
runner = Zombie()  # Second zombie

# walker and runner are distinct objects!

Analogy:
- Zombie = the zombie blueprint
- walker = a specific zombie named “Walker”
- runner = a specific zombie named “Runner”

📦 What do objects have?

1. Attributes = Properties

These are the data an object holds.

class Zombie:
    def __init__(self, name, health):
        self.name = name      # Attribute: name
        self.health = health  # Attribute: health

walker = Zombie("Walker", 50)
print(walker.name)    # "Walker"
print(walker.health)  # 50

Analogy: A character’s stats in a game.

2. Methods = Actions

These are the functions an object can execute.

class Zombie:
    def __init__(self, name, health):
        self.name = name
        self.health = health

    def groan(self):  # Method: make a sound
        print(f"{self.name}: Braaaains! 🧟")

    def attack(self):  # Method: deal damage
        return 10  # Damage dealt

walker = Zombie("Walker", 50)
walker.groan()          # "Walker: Braaaains! 🧟"
damage = walker.attack()  # 10

Analogy: A character’s abilities in a game.

🎮 Example: Zombie vs Human

class Zombie:
    def __init__(self, name, health):
        self.name = name
        self.health = health

    def attack(self):
        return 10  # Damage

class Human:
    def __init__(self, name, health):
        self.name = name
        self.health = health

    def attack(self, zombie):
        damage = 20
        zombie.health -= damage
        print(f"{self.name} attacks {zombie.name}!")
        print(f"Damage: {damage}. Zombie health: {zombie.health}")

# Create objects
walker = Zombie("Walker", 50)
rick = Human("Rick", 100)

# Objects interact!
rick.attack(walker)
# Rick attacks Walker!
# Damage: 20. Zombie health: 30

The magic of OOP: Objects talk to each other!

🌟 Why use OOP?

✅ Benefits:

1. Code organization

# Without OOP: scattered variables
z1_name = "Walker"
z1_health = 50
z2_name = "Runner"
z2_health = 30

# With OOP: everything in objects
walker = Zombie("Walker", 50)
runner = Zombie("Runner", 30)

2. Reusability

# Create 100 zombies — same code every time!
zombies = [Zombie(f"Zombie {i}", 50) for i in range(100)]

3. Readability

# Code reads like a description of the real world
rick.attack(walker)  # Rick attacks the walker
walker.groan()       # Walker groans

4. Scalability

# Easy to add new capabilities
class Zombie:
    def evolve(self):  # New method
        self.health += 20
        self.speed += 1

❌ Before OOP it was messy:

# Functions with tons of parameters
def attack_zombie(human_name, human_damage, zombie_name, zombie_health):
    zombie_health -= human_damage
    return zombie_health

# Easy to get confused 😵
new_health = attack_zombie("Rick", 20, "Walker", 50)

🗺️ The four pillars of OOP

OOP is built on four principles:

1. Encapsulation 📦

Data and methods are bundled together in one object.

class Zombie:
    def __init__(self, health):
        self._health = health  # "Private" attribute

    def damage(self, amount):
        self._health -= amount  # Accessed through a method

2. Inheritance 🧬

Classes can inherit properties from other classes.

class FastZombie(Zombie):  # Inherits from Zombie
    def __init__(self, name):
        super().__init__(name, 30)  # Less HP
        self.speed = 10             # But faster!

(Covered in the next lesson)

3. Polymorphism 🦎

Different objects can have methods with the same name.

walker.attack()  # Zombie attacks
rick.attack()    # Human attacks
# Same method name, different implementations!

4. Abstraction 🎭

Hide complexity, expose only the interface.

car.start()  # Just start the car
# No need to know about fuel injection, pistons, ignition timing

💡 When to use OOP?

✅ Use OOP when:

  • You’re creating many similar entities (players, enemies, items)
  • You need data + behavior together (not just a dict, but an object with methods)
  • The code is getting complex (OOP helps organize it)
  • You’re modeling the real world (cars, people, buildings)

❌ OOP is NOT needed when:

  • It’s a simple script (a 20-line calculator)
  • There’s one task (download a file and done)
  • Functions are sufficient (don’t over-engineer!)

Rule of thumb: Start with functions. Switch to OOP when things get complicated.

🎓 Key terminology

Term Meaning Example
Class Template / blueprint class Zombie:
Object Instance of a class walker = Zombie()
Attribute Property of an object walker.health
Method Action of an object walker.attack()
self Reference to the object itself self.health
__init__ Constructor (initialization) def __init__(self):

📝 Checklist: Do you understand OOP?

  • [ ] I know the difference between a class and an object
  • [ ] I understand what attributes (properties) are
  • [ ] I understand what methods (actions) are
  • [ ] I can create a simple class
  • [ ] I can create multiple objects from one class
  • [ ] I understand why self is needed
  • [ ] I understand why __init__ is needed

🚀 Summary

OOP is a way to organize code around objects.

Class = blueprint (description)
Object = instance (a concrete thing)

Why?
- ✅ Organization (code structure)
- ✅ Reusability (DRY principle)
- ✅ Readability (models the real world)
- ✅ Scalability (easy to extend)

Remember:
- Before OOP: functions and variables (scattered)
- With OOP: objects (data + functions together)
- OOP = modeling the real world in code 🌍

Next step: Create your first class and object! 🎉


Ready to code? Head over to the exercises — let’s build a zombie apocalypse! 🧟⚔️

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

Setting Up Your Environment: Python, pip, and VS …

Before writing code locally, you need to set up three tools: Python, pip, and VS...

📅 04.06.2026 👁️ 17
📝

Anthropic SDK: Getting Started with the Claude API

Anthropic Python SDK is the official library for working with Claude. It hides the complexity...

📅 04.06.2026 👁️ 18
📝

The datetime Module: Working with Dates and Times

datetime is Python's standard module for working with dates and times. It's part of the...

📅 08.05.2026 👁️ 67

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!