2012-10-30 81 views
11

我在Windows上使用python 2.7.3。我試圖覆蓋__instancecheck__作爲類方法的魔術方法。但我無法讓它工作。類方法__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應該將類/類型作爲第二個參數。

有誰知道問題是什麼?謝謝。

回答

18

instancecheck必須在元類中定義:

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


class EnumInt(int): 
    __metaclass__ = Enumeration 

print isinstance('foo', EnumInt) # prints True 

這是爲什麼?出於同樣的原因,你的第二個例子工作。當蟒蛇評估isinstance(A, B)它假定B爲對象,尋找其類,並在該類調用__instancecheck__

isinstance(A, B): 
    C = class-of(B) 
    return C.__instancecheck__(A) 

但當B是一類本身,那麼它的類C應該是一類一類的,換句話說,一個元類!