Data Encapsulation: Bundles data and methods within an object, hiding internal details and providing controlled access to the data.
Inheritance: Enables a new class to inherit properties and behaviors from an existing class, promoting code reusability and hierarchical organization.
Polymorphism: It allows objects to perform different functions based on the context (Class/Subclass) they are called in. In Python, this is mainly done using Method Overriding.
Data Abstraction: Hides implementation details, exposing only essential features of an object, improving code manageability and maintainability.
Composition: It allows a class to leverage the behaviors and functionalities of its component classes without necessarily inheriting from them. This is done by including the other class in the body of the object.