Object-Oriented Programming (OOP): Classes and Objects

Introduction to Object-Oriented Programming concepts using Python. Learn to define classes and create objects.


Object-Oriented Programming (OOP) in Python

Object-Oriented Programming (OOP): Classes and Objects

Object-Oriented Programming (OOP) is a programming paradigm based on the concept of "objects", which contain data, in the form of fields (often known as attributes), and code, in the form of procedures (often known as methods).

  • Class: A class is a blueprint or a template for creating objects. It defines the attributes (data) and methods (behavior) that objects of that class will have. Think of it as a cookie cutter. It defines the shape, but you can use it to create many individual cookies.
  • Object: An object is an instance of a class. It is a concrete, tangible entity that is created based on the class definition. Think of it as an actual cookie made using the cookie cutter (the class). Each cookie (object) is independent and can have its own values for the attributes defined in the class.

Key advantages of OOP include:

  • Modularity: OOP breaks down complex problems into smaller, manageable objects.
  • Reusability: Classes can be reused to create multiple objects, saving time and effort.
  • Maintainability: Changes to one part of the code (one class) are less likely to affect other parts.
  • Abstraction: OOP hides the internal implementation details of an object and exposes only the necessary interface to interact with it.
  • Encapsulation: OOP bundles data (attributes) and methods that operate on that data within a class, protecting data from unauthorized access.
  • Polymorphism: OOP allows objects of different classes to be treated as objects of a common type.
  • Inheritance: OOP allows creating new classes (child classes) based on existing classes (parent classes), inheriting their attributes and methods.

Introduction to Object-Oriented Programming Concepts using Python

Python is an object-oriented programming language. This means you can use Python to define classes, create objects, and utilize OOP principles like inheritance and polymorphism. Python's syntax makes OOP relatively straightforward to implement.

Learn to Define Classes and Create Objects in Python

Defining a Class

To define a class in Python, you use the class keyword. Inside the class, you define attributes (variables) and methods (functions).

 class Dog:
    # Class attribute (shared by all instances)
    species = "Canis familiaris"

    # Instance attributes (unique to each instance)
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed
        self.is_hungry = True  #default value

    # Instance method
    def bark(self):
        return "Woof!"

    def feed(self):
        if self.is_hungry:
            print(f"{self.name} is eating...")
            self.is_hungry = False
        else:
            print(f"{self.name} is not hungry.") 

Explanation:

  • class Dog: defines a class named Dog.
  • species = "Canis familiaris" is a class attribute. All Dog objects will share this attribute.
  • __init__(self, name, breed): is a special method called the constructor. It's called when a new Dog object is created. self refers to the object itself. name and breed are parameters passed when creating the object.
  • self.name = name and self.breed = breed assign the values passed in to the object's instance attributes. Each dog object will have its own name and breed.
  • bark(self): is a method that defines the behavior of a Dog object. When called it returns the string "Woof!".
  • feed(self): is a method that simulates feeding the dog. It uses the is_hungry attribute to determine if the dog needs to be fed.

Creating Objects (Instances of a Class)

To create an object of a class, you call the class name like a function, passing any necessary arguments to the constructor (__init__ method).

 # Creating objects
my_dog = Dog("Buddy", "Golden Retriever")
your_dog = Dog("Lucy", "Poodle")

# Accessing attributes
print(my_dog.name)    # Output: Buddy
print(your_dog.breed)   # Output: Poodle
print(Dog.species) #Output: Canis familiaris

# Calling methods
print(my_dog.bark())   # Output: Woof!
my_dog.feed()         #Output: Buddy is eating...
my_dog.feed()         #Output: Buddy is not hungry. 

Explanation:

  • my_dog = Dog("Buddy", "Golden Retriever") creates a new Dog object named my_dog. The __init__ method is automatically called, setting the name to "Buddy" and the breed to "Golden Retriever".
  • your_dog = Dog("Lucy", "Poodle") creates another Dog object named your_dog with different attribute values.
  • my_dog.name accesses the name attribute of the my_dog object.
  • my_dog.bark() calls the bark method of the my_dog object.
  • Dog.species accesses the class attribute species. Since it is a class attribute, you can access it either from the class itself or from an instance of the class (e.g., `my_dog.species`). It's best practice to use the class name for clarity.