метод класса __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

  • Как получить информацию из facebook с помощью python?
  • использование numpy в cython: определение ndarray datatype / ndims
  • Python с Google App Engine. AttributeError: объект 'module' не имеет сообщения об ошибке «HTTPSHandler»
  • Как избежать предупреждения «Это сообщение не было отправлено» при отправке электронной почты с помощью Google App Engine?
  • как распечатать содержимое PYTHONPATH
  • Загрузите файл с именем пользователя и паролем, используя Python
  • Каков правильный способ проверить False?
  • Как установить подпроцесс переменной?
  •  
    Interesting Posts for Van-Lav

    AttributeError: объект 'module' не имеет атрибута ''

    Vim: выделите один символ в столбце 80

    Взаимная блокировка потока исключений, с отбрасыванием в очереди функций mutex / lock в Python?

    как обращаться к родительскому методу в python?

    Python mechanize javascript

    Класс () vs self .__ class __ () при создании объекта?

    ссылка перед ошибкой присваивания в python

    Использование panda для сравнения значений столбцов и создания столбца на основе значений в сравниваемых столбцах?

    Правильно закодировать путь к файлу с помощью python

    AWS EMR выполняет сценарий «bootstrap» на всех уже запущенных машинах в кластере

    distutils: Как передать пользовательский параметр setup.py?

    limit () и sort () порядок pymongo и mongodb

    Кто-нибудь успел получить Django для отправки электронных писем при размещении на Dreamhost?

    Запуск сценариев Python, таких как PHP

    LiveServerTestCase Django всегда сбой из-за конфликтующего адреса … Несмотря на отсутствие адреса

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