# A class that breaks singledispatch class MetaA(type): def __len__(self): return 0 class A(metaclass=MetaA): pass class AA(A): pass from functools import singledispatch @singledispatch def fun(a): print('base A') @fun.register(A) def _(a): print('fun A') aa = AA() # This should print # fun A fun(aa)