类方法__instancecheck__不起作用

ada*_*liu 13 python

我在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
Run Code Online (Sandbox Code Playgroud)

我假设第一个print语句将为True.但似乎__instancecheck__没有调用神奇的方法.我不知道为什么第二个print语句可以工作,因为isinstance应该将class/type作为第二个参数.

有谁知道问题是什么?谢谢.

geo*_*org 18

instancecheck 必须在元类中定义:

class Enumeration(type):
    def __instancecheck__(self, other):
        print 'hi'
        return True


class EnumInt(int):
    __metaclass__ = Enumeration

print isinstance('foo', EnumInt) # prints True
Run Code Online (Sandbox Code Playgroud)

这是为什么?出于同样的原因,为什么你的第二个例子有效 当python评估isinstance(A, B)它假定B是一个对象时,查找它的类并调用__instancecheck__该类:

isinstance(A, B):
    C = class-of(B)
    return C.__instancecheck__(A)
Run Code Online (Sandbox Code Playgroud)

但是当B一个类本身,那么它的类C应该是一个类的类,换句话说,一个元类!

  • 对于Python 3,你必须使用“class EnumInt(int, metaclass=Enumeration)” (2认同)

Kos*_*Kos 5

文档说:

请注意,这些方法是在类的类型(元类)上查找的.它们不能在实际类中定义为类方法.这与在实例上调用的特殊方法的查找一致,只是在这种情况下,实例本身就是一个类.

http://docs.python.org/2/reference/datamodel.html#customizing-instance-and-subclass-checks