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
The docs say:
Note that these methods are looked up on the type (metaclass) of a class. They cannot be defined as class methods in the actual class. This is consistent with the lookup of special methods that are called on instances, only in this case the instance is itself a class.
http://docs.python.org/2/reference/datamodel.html#customizing-instance-and-subclass-checks
instancecheck
must be defined in a metaclass:
class Enumeration(type):
def __instancecheck__(self, other):
print 'hi'
return True
class EnumInt(int):
__metaclass__ = Enumeration
print isinstance('foo', EnumInt) # prints True
Why is that? For the same reason why your second example worked. When python evaluates isinstance(A, B)
it assumes B
to be an object, looks for its class and calls __instancecheck__
on that class:
isinstance(A, B):
C = class-of(B)
return C.__instancecheck__(A)
But when B
is a class itself, then its class C
should be a class of a class, in other words, a meta-class!