我在Windows上使用python 2.7.3。我试图将__instancecheck__
魔术方法覆盖为类方法。但我不能让它发挥作用。
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
我假设第一个print语句将为True。但似乎没有调用神奇的方法__instancecheck__
。而且我不知道为什么第二个print语句可以工作,因为isinstance
应该将类/类型作为第二个参数。
有谁知道问题是什么?感谢。
答案 0 :(得分:18)
instancecheck
:
class Enumeration(type):
def __instancecheck__(self, other):
print 'hi'
return True
class EnumInt(int):
__metaclass__ = Enumeration
print isinstance('foo', EnumInt) # prints True
为什么?出于同样的原因,为什么你的第二个例子有效当python评估isinstance(A, B)
时,它假定B
为对象,查找其类并在该类上调用__instancecheck__
:
isinstance(A, B):
C = class-of(B)
return C.__instancecheck__(A)
但是当B
是一个类本身时,它的类C
应该是一个类的类,换句话说,一个元类!
答案 1 :(得分:5)
文档说:
请注意,这些方法是在类的类型(元类)上查找的。它们不能在实际类中定义为类方法。这与在实例上调用的特殊方法的查找一致,只是在这种情况下,实例本身就是一个类。
http://docs.python.org/2/reference/datamodel.html#customizing-instance-and-subclass-checks