【问题标题】:class method __instancecheck__ does not work类方法 __instancecheck__ 不起作用
【发布时间】:2012-10-30 09:06:45
【问题描述】:

我在 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

我假设第一个打印语句会得到 True。但似乎没有调用魔术方法__instancecheck__。而且我不知道为什么第二个打印语句可以工作,因为isinstance 应该将类/类型作为第二个参数。

有谁知道问题出在哪里?谢谢。

【问题讨论】:

    标签: python


    【解决方案1】:

    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应该是一个类中的一个类,也就是一个元类!

    【讨论】:

    • 无法在 python 3 中重现这个
    【解决方案2】:

    文档说:

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

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

    【讨论】:

    • 谢谢。 @thg435 给了我一个很好的例子,现在我知道如何做到这一点了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2016-05-23
    • 2018-03-02
    • 2013-06-03
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多