Inheritance in Python

Inheritance is a fundamental concept in object-oriented programming that allows a new class to be based on an existing class, inheriting its properties and methods. In Python, you can create a subclass that inherits the properties and methods of a parent class using the `class` statement and the `super()` function.

Here is an example of creating a subclass that inherits from a parent class in Python:

python
# Define a parent class
class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species

    def speak(self):
        print("I am an animal.")

# Define a child class that inherits from the parent class
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name, species="Dog")
        self.breed = breed

    def speak(self):
        print("Woof!")

# Create an object of the child class
my_dog = Dog("Buddy", "Golden Retriever")

# Call a method of the object
print(my_dog.name)      # Output: "Buddy"
print(my_dog.species)   # Output: "Dog"
my_dog.speak()          # Output: "Woof!"

In this example, a parent class called `Animal` is defined with two properties (`name` and `species`) and one method (`speak()`). A child class called `Dog` is defined that inherits from the `Animal` class and adds one property (`breed`) and overrides the `speak()` method.

An object of the `Dog` class is created with the `Dog(“Buddy”, “Golden Retriever”)` statement. The `name`, `species`, and `speak()` methods of the object are then called with the `my_dog.name`, `my_dog.species`, and `my_dog.speak()` statements, which output messages to the console.

In Python, you can also inherit from multiple classes using multiple inheritance. Here is an example:

python
# Define two parent classes
class A:
    def method_a(self):
        print("Method A")

class B:
    def method_b(self):
        print("Method B")

# Define a child class that inherits from two parent classes
class C(A, B):
    def method_c(self):
        print("Method C")

# Create an object of the child class
my_object = C()

# Call methods of the object
my_object.method_a()   # Output: "Method A"
my_object.method_b()   # Output: "Method B"
my_object.method_c()   # Output: "Method C"

In this example, two parent classes called `A` and `B` are defined with one method each. A child class called `C` is defined that inherits from both `A` and `B` and adds one method. An object of the `C` class is created with the `C()` statement. The `method_a()`, `method_b()`, and `method_c()` methods of the object are then called with the `my_object.method_a()`, `my_object.method_b()`, and `my_object.method_c()` statements, which output messages to the console.

Inheritance is a powerful feature of Python and is used extensively in object-oriented programming to create reusable code and organize complex systems.