I am using python 2.7.3 on Windows. I tried to override the __instancecheck__
magic method as a class method. But I can not make it work.
class Enumeration(int):
@classmethod
def __instancecheck__(cls, inst):
if type(inst) == cls:
return True
if isinstance(inst, int) and inst in range(0,10):
return True
return False
print isinstance(1, Enumeration) # prints False
print isinstance(1, Enumeration()) # prints True
I assume the first print statement would get True. But it seems the magic method __instancecheck__
is not called. And I don't know why the second print statement can work since the isinstance
should take a class/type as the second parameter.
Does anyone know what the problem is? Thanks.
instancecheck
must be defined in a metaclass:Why is that? For the same reason why your second example worked. When python evaluates
isinstance(A, B)
it assumesB
to be an object, looks for its class and calls__instancecheck__
on that class:But when
B
is a class itself, then its classC
should be a class of a class, in other words, a meta-class!The docs say:
http://docs.python.org/2/reference/datamodel.html#customizing-instance-and-subclass-checks