Hice un video tutorial donde explico cómo funciona la herencia de clases en programación orientada a objetos.

Primera parte

Segunda parte

Código fuente

A continuación puedes encontrar el código utilizado en este video:

class Vehiculo:
    nombre = ''
    llantas = 0
    motor = 0
    encendido = "Apagado"

    def __init__(self, nombre, llantas, motor):
        self.nombre = nombre
        self.llantas = llantas
        self.motor = motor

    def encender(self):
        self.encendido = "Encendido"

    def apagar(self):
        self.encendido = "Apagado"


class Auto(Vehiculo):
    puertas = 0
    puertas_abiertas = False

    def __init__(self, nombre, llantas, motor, puertas):
        self.nombre = nombre
        self.llantas = llantas
        self.motor = motor
        self.puertas = puertas

    def abrir_puertas(self):
        self.puertas_abiertas = True

    def cerrar_puertas(self):
        self.puertas_abiertas = False


class Moto(Vehiculo):
    pass


class Autobus(Vehiculo):
    max_pasajeros = 0
    pasajeros = 0
    tarifa = 0
    pasaje_recaudado = 0

    def __init__(self, nombre, llantas, motor, tarifa, max_pasajeros):
        self.nombre = nombre
        self.llantas = llantas
        self.motor = motor
        self.tarifa = tarifa
        self.max_pasajeros = max_pasajeros

    def abordar_pasajeros(self, pasajeros_abordando):
        nuevos_pasajeros = self.pasajeros + pasajeros_abordando
        if nuevos_pasajeros > self.max_pasajeros:
            print("El bus ya está lleno")
        else:
            self.pasajeros = nuevos_pasajeros
            self.pasaje_recaudado = self.pasaje_recaudado + (pasajeros_abordando * self.tarifa)

    def desbordar_pasajeros(self, pasajeros_desbordando):
        nuevos_pasajeros = self.pasajeros + pasajeros_desbordando
        if nuevos_pasajeros < 0:
            print("El bus ya está vacío")
        else:
            self.pasajeros = nuevos_pasajeros