метод класса __instancecheck__ не работает

Я использую python 2.7.3 для Windows. Я попытался переопределить метод __instancecheck__ magic как метод класса. Но я не могу заставить его работать.

 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 должен взять класс / тип в качестве второго параметра.

Кто-нибудь знает, в чем проблема? Благодарю.

2 Solutions collect form web for “метод класса __instancecheck__ не работает”

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 должен быть классом класса, другими словами, метаклассом!

Документы говорят:

Обратите внимание, что эти методы проверяются на тип (метакласс) класса. Они не могут быть определены как методы класса в реальном классе. Это согласуется с поиском специальных методов, вызываемых экземплярами, только в этом случае экземпляр сам по себе является классом.

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

  • Использование пакета struct в python
  • else & elif не работает в Python
  • Может ли переменная класса быть экземпляром класса?
  • python удаляет повторяющиеся словари из списка
  • Может кто-нибудь объяснить мне этот код декоратора?
  • UnicodeDecodeError: кодек ascii не может декодировать байт 0xc3 в позиции 0: порядковый номер не в диапазоне (128)
  • Создание папки с меткой времени
  • изменение разрешений файлов в python
  •  
    Interesting Posts for Van-Lav

    Интерполяция и регуляризация временных рядов Python pandas

    Чтение файла с использованием относительного пути в проекте python

    Каково использование возврата self в методе __iter__?

    преобразовать целое число в двоичный

    Самый простой способ получить имена функций после запуска SelectKBest в Scikit Learn

    Как найти точную команду CLI для Python?

    Redux: Как мне заставить Jython использовать модули Python, хранящиеся в Lib, в своем собственном файле jar при запуске в Hadoop?

    pyqt4 уже имеет макет. Как «обнаружить» его или изменить?

    Оптимизация пула строк Python Interpreter

    Получение подмножества href's от findall () в BeautifulSoup

    urllib2.URLError: отказ при рукопожатии

    Развертывание приложения Flask для совместного размещения в godaddy

    Написание текста с диакритическим («nikud», отметки вокализации) с использованием PIL (Python Imaging Library)

    pyside connection Ошибка "RuntimeError: не удалось подключить сигнал нажал ()"

    Оценка малого временного сдвига между двумя временными рядами

    Python - лучший язык программирования в мире.