class Regular: pass assert isinstance(Regular(), Regular) class MCNotInstanceOf(type): def __instancecheck__(self, instance): return False class NotInstanceOf(metaclass=MCNotInstanceOf): pass class InheritedNotInstanceOf(NotInstanceOf): pass assert not isinstance(Regular(), NotInstanceOf) assert not isinstance(1, NotInstanceOf) # weird cpython behaviour if exact match then isinstance return true assert isinstance(NotInstanceOf(), NotInstanceOf) assert not NotInstanceOf.__instancecheck__(NotInstanceOf()) assert not isinstance(InheritedNotInstanceOf(), NotInstanceOf) class MCAlwaysInstanceOf(type): def __instancecheck__(self, instance): return True class AlwaysInstanceOf(metaclass=MCAlwaysInstanceOf): pass assert isinstance(AlwaysInstanceOf(), AlwaysInstanceOf) assert isinstance(Regular(), AlwaysInstanceOf) assert isinstance(1, AlwaysInstanceOf) class GenericInstance: def __instancecheck__(self, _): return True assert isinstance(Regular(), GenericInstance()) assert isinstance([], GenericInstance()) assert isinstance(1, GenericInstance()) class MCReturnInt(type): def __instancecheck__(self, instance): return 3 class ReturnInt(metaclass=MCReturnInt): pass assert isinstance("a", ReturnInt) is True assert isinstance(1, ((int, float,), str))