Part1. self in OOPS python

self in OOPS python

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model
    def start_engine(self):
        print(f"The {self.make} {self.model}'s engine is starting.")
my_car = Car("Toyota", "Camry")
my_car.start_engine()
In object-oriented programming (OOPS) in Python, self is a special keyword that refers to the instance of the class itself.
It is the first parameter of any method in a class and is automatically passed in when an instance method is called.
When a method is called on an instance of a class, self refers to that specific instance of the class. This allows you to
access and manipulate the instance's attributes and methods.
In the above example, self refers to the specific instance of the Car class that is being created (my_car). When the start_engine 
method is called on my_car, self allows the method to access the specific make and model attributes of that instance.
Note that the name self is a convention, and you could technically use any other name for the first parameter of a method that 
refers to the instance. However, self is the standard convention and it is recommended to use it to make your code more readable 
and easier to understand.