from abc import ABCMeta class Animal(metaclass=ABCMeta): pass class Plant(metaclass=ABCMeta): def __init_subclass__(cls): global broken_class broken_class = cls assert not issubclass(cls, Animal), "Plants cannot be Animals" class Dog(Animal): pass try: class Triffid(Animal, Plant): pass except Exception as e: pass # prints True, that's probably bad print(broken_class in Animal.__subclasses__()) # Animal is properly initialized, therefore this is True print("_abc_impl" in Animal.__dict__) # since Triffid wasn't properly initialized, it's also missing an _abc_impl attribute print("_abc_impl" in broken_class.__dict__) # therefore if you read that attribute, it is found via its base class Animal print(broken_class._abc_impl is Animal._abc_impl)