Methods and Object-Oriented Programming (OOP) Fundamentals
From the Cs curriculum
Methods and Object-Oriented Programming (OOP) Fundamentals
TL;DR
Object-Oriented Programming organizes code around "objects" that combine data and behavior, making programs more modular and easier to manage. Methods are functions specifically associated with these objects, defining what an object can do. OOP principles like encapsulation, inheritance, and polymorphism help you write reusable and flexible code.
1. The Mental Model
Think of OOP like building with LEGO bricks. Each brick (an object) knows what it is (its data) and how it connects to other bricks (its methods). You combine these self-contained bricks to build complex structures, making it easy to create new things or change parts without rebuilding everything from scratch.
2. The Core Material
What is an Object?
In programming, an object is a self-contained unit that groups related data (also called attributes or properties) with functions (called methods) that operate on that data. It's like a blueprint for something real-world, say, a Car. A car has data like color, speed, make, and methods like accelerate(), brake(), turn().
What is a Method?
A method is simply a function that belongs to an object. It describes an action the object can perform or a way to interact with its data. When you call myCar.accelerate(), you're telling the myCar object to execute its accelerate method.
Classes: The Blueprints for Objects
You don't create objects directly; you create a class, which acts as a blueprint or template. From this class, you can create many individual objects, each called an instance of that class. So, Car is a class, and myToyota and yourHonda are instances (objects) of the Car class.
Here's Python code showing a simple class and object:
class Dog:
# This is a class attribute, shared by all Dog objects
species = "Canis lupus familiaris"
def __init__(self, name, age):
# This is the constructor method. It runs when a new Dog object is created.
# 'self' refers to the instance of the object itself.
self.name = name # Instance attribute
self.age = age # Instance attribute
def bark(self):
# This is an instance method. It operates on the object's data.
return f"{self.name} says Woof!"
def get_age_in_human_years(self):
# Another instance method
return self.age * 7
# Creating objects (instances) from the Dog class
my_dog = Dog("Buddy", 3)
your_dog = Dog("Lucy", 5)
# Accessing attributes
print(f"{my_dog.name} is {my_dog.age} years old.")
print(f"Lucy's species: {your_dog.species}")
# Calling methods
print(my_dog.bark())
print(f"{your_dog.name} is {your_dog.get_age_in_human_years()} human years old.")
Core OOP Principles
-
Encapsulation: This means bundling data (attributes) and methods that operate on the data within a single unit (the object), and restricting direct access to some of an object's components. You interact with an object through its well-defined methods, rather than directly touching its internal data. This protects the data from external, unintended changes. Think of a remote control for a TV: you use buttons (methods) to change channels or volume, you don't directly manipulate the TV's internal circuitry.
-
Inheritance: Allows a new class (subclass or child class) to inherit attributes and methods from an existing class (superclass or parent class). This promotes code reuse. For example,
SportsCarandSedancould inherit from aCarclass, sharing common properties and behaviors, but also adding their own unique ones. -
Polymorphism: Means "many forms." It allows objects of different classes to be treated as objects of a common superclass. This often involves methods with the same name behaving differently depending on the object type. If
DogandCatboth inherit fromAnimaland both have amake_sound()method, callinganimal.make_sound()will produce a bark for aDogobject and a meow for aCatobject, even though the call looks the same.
Here's a hierarchy showing inheritance:
graph TD
A["Animal"] --> B["Dog"]
A --> C["Cat"]
B --> D["Golden Retriever"]
B --> E["Poodle"]
C --> F["Siamese"]
C --> G["Persian"]
3. Worked Example
Let's expand the Dog example to demonstrate inheritance and basic polymorphism. We'll create a GoldenRetriever class that inherits from Dog, adding a specific behavior.
class Dog:
species = "Canis lupus familiaris"
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
return f"{self.name} says Woof!"
def describe(self):
return f"{self.name} is a {self.age}-year-old {self.species}."
class GoldenRetriever(Dog): # GoldenRetriever inherits from Dog
def __init__(self, name, age, loves_swimming):
# Call the constructor of the parent class (Dog)
super().__init__(name, age)
self.loves_swimming = loves_swimming # New attribute for GoldenRetriever
def retrieve(self, item):
return f"{self.name} proudly retrieves the {item}!"
# We can override the bark method specifically for Golden Retrievers
def bark(self):
return f"{self.name} gives a friendly 'Woof woof!'"
# Creating a regular Dog object
generic_dog = Dog("Max", 2)
print(generic_dog.describe())
print(generic_dog.bark())
print("-" * 20)
# Creating a GoldenRetriever object
golden_buddy = GoldenRetriever("Buddy", 4, True)
print(golden_buddy.describe()) # Inherited method
print(golden_buddy.bark()) # Overridden method
print(golden_buddy.retrieve("tennis ball")) # New method
print(f"Does {golden_buddy.name} love swimming? {golden_buddy.loves_swimming}")
As you can see, golden_buddy uses methods from its Dog parent (like describe), but also has its own (like retrieve) and can change inherited behavior (like bark).
4. Key Takeaways
- Objects combine data (attributes) and behavior (methods) into single units.
- Classes are blueprints for creating objects, and objects are instances of classes.
- Methods are functions that belong to an object and operate on its data.
- Encapsulation hides internal object details and exposes controlled interactions via methods.
- Inheritance allows new classes to reuse code and behaviors from existing classes.
- Polymorphism enables objects of different classes to respond uniquely to the same method call, promoting flexibility.
- OOP helps manage complexity by breaking programs into smaller, more understandable pieces.
Avoid these common mistakes:
- Trying to access an object's internal data directly rather than using a method (breaking encapsulation).
- Over-complicating class hierarchies; sometimes simple functions are better than complex inheritance.
- Forgetting self as the first parameter in instance methods within a class definition.
- Not understanding the difference between class attributes (shared by all instances) and instance attributes (unique to each instance).
5. Now Try It
Create a Cat class with attributes like name, age, and breed, and methods like meow() (which prints the cat's name and "Meow!"), sleep(), and describe(). Then, create at least two Cat objects with different attributes, and call all their methods. What does it look like?
Frequently asked about Methods and Object-Oriented Programming (OOP) Fundamentals
More from Cs
Get the full Cs curriculum
Clone the complete plan to your dashboard for unlimited AI-generated notes, practice quizzes, and a personalised revision schedule.
Create Free Account