#python #class #equality #python-2.5
#python #класс #равенство #python-2.5
Вопрос:
Я просмотрел документацию по Python 2.5 и не смог найти ответа на этот: Как мне проверить, относится ли объект к тому же классу, что и другой объект?
def IsClass(obj1, obj2):
return obj1.class == obj2.class #doesn't work
Ответ №1:
Вы можете использовать
type(obj1) is type(obj2)
Обратите внимание, что обычно вы пытаетесь избежать проверки типов в Python, а скорее полагаетесь на утиный ввод.
Комментарии:
1. Последнее предложение должно быть выделено жирным шрифтом. И красный, если markdown поддерживает это. Это не может быть достаточно растянуто. Если вы считаете, что вам это нужно, вы, скорее всего, этого не делаете и должны просто использовать привязку к утке.
2. Вам также следует рассмотреть возможность использования
issubclass()
orisinsntance()
, когда вас интересуют реальные типы, поскольку в большинстве случаев, когда вы ищетеfoo
, вы также приняли бы подклассfoo
.3. Прошло много времени, но вы помните, какую версию Python вы использовали для проверки своего ответа? Возможно, вам следует добавить большое жирное примечание о том, что ответ может не относиться к другим версиям. Например. он не будет работать для Python 2.7 (по умолчанию во многих системах с 2016 года). Но это работает с Python 3.4 и 3.5.
4. @m000: Это определенно работает в Python 2.7. На самом деле это должно работать в любой версии Python, когда-либо. Обратите внимание, что это проверяет идентичность типа, что в большинстве ситуаций не то, что вам нужно. Также прочитайте первые два комментария к этому ответу.
5. @SvenMarnach Проблема, похоже, в классах в стиле старого и нового стилей. Вики. python.org/moin/NewClassVsClassicClass Я использовал этот тестовый код: pastebin.com/nmpYJdGJ Для python 2.7
type(obj)
сравнение работает только с классами нового стиля . Т.е. ваши классы должны расширятьсяobject
. Классы старого стиля были заменены с Python 2.2, но при их использовании интерпретатор не выдает предупреждений. Сравнение__class__
свойства, похоже, работает независимо от стиля классов.
Ответ №2:
Я думаю, что вы хотите сделать, это использовать type (obj). 🙂
-РЕДАКТИРОВАТЬ- Похоже, он меня опередил. И он прав насчет набора текста уткой.