You can use GeoPandas and Shapely to:
1 Extract all polygon boundaries
2 Union them
3 Polygonize
4 Join attributes from the original polygons
import geopandas as gpd
import shapely
import matplotlib.pyplot as plt
df = gpd.read_file(r"/home/bera/Desktop/GIStest/overlaps.geojson")
#df.shape
#(100, 2)
boundaries = df.geometry.boundary.tolist() #A list of all polygon boundaries (as multilinestrings)
boundaries_noded = shapely.unary_union(boundaries) #Union to one multilinestring so vertices are created at each line crossing
singleparts = list(boundaries_noded.geoms) #List all linestrings in the multilinestring to be able to polygonize it
new_polys = shapely.get_parts(shapely.polygonize(singleparts)) #Polygonize creates a geometrycollection, extract all polygons in it
new_polys = gpd.GeoDataFrame(geometry=new_polys, crs=df.crs)
#Create a point df by placing a point in each new polygon
new_points = gpd.GeoDataFrame(geometry=new_polys.geometry.representative_point(), crs=df.crs)
#new_points.shape
#(185, 1)
#Join all attributes from the original df to the points
#new_points.columns
#Index(['geometry'], dtype='object')
new_points_with_attrs = gpd.sjoin(left_df=new_points, right_df=df, how="left")
#new_points_with_attrs.shape
#(295, 3) #From 185 to 295: Points are duplicated where polygons overlap
#new_points_with_attrs.columns
#Out[146]: Index(['geometry', 'index_right', 'id'], dtype='object') #The id column from df was joined
#Then join the point data to the new polygons
new_points_with_attrs = new_points_with_attrs[[col for col in new_points_with_attrs.columns if "index" not in col.lower()]] #Drop the index_right colunm
new_polys_with_attrs = gpd.sjoin(left_df=new_polys, right_df=new_points_with_attrs, how="left") #Or the join will fail
#Calculate number of identical geometries (=overlaps)
new_polys_with_attrs["wkt"] = new_polys_with_attrs.apply(lambda x: x.geometry.wkt, axis=1)
new_polys_with_attrs["overlaps"] = new_polys_with_attrs.groupby('wkt')['wkt'].transform('count')
#There are 102 polygons which do not overlap, 120 which overlap another, 57 two others, and 16 where four polygons overlap
new_polys_with_attrs["overlaps"].value_counts().sort_index()
1 102
2 120
3 57
4 16
fig, ax = plt.subplots(figsize=(15, 15))
new_polys_with_attrs.plot(ax=ax, column="overlaps", legend=True, cmap='YlOrRd')

#You can extract the polygons with different number of overlaps with
overlaps_4 = new_polys_with_attrs.loc[new_polys_with_attrs["overlaps"]==4]
overlaps_4.plot(color="red")
