Код ниже использует шаблон
if type(OBJECT) is types
, для сравнения экземпляра пользовательского списка
MyList
, который
наследуется от встроенного типа list
. В данном случае, это НЕ предпочтительный шаблон для сравнения типов.
class MyList(list):
pass
lst = MyList('test')
print(lst)
# плохая практика
if type(lst) is list:
print('Это список')
else:
print('Это НЕ список')
# ['t', 'e', 's', 't']
# Это НЕ список
# type - это тип всех типов, для которых
# явно не указан иной метакласс
>>> type(list)
# <class 'type'>
>>> type(int)
# <class 'type'>
>>> class Bar(): pass
>>> type(Bar)
# <class 'type'>
>>> b = Bar()
>>> type(b)
# <class '__main__.Bar'>
Класс type()
лучше использовать для прямого сравнения типа (идентичности) экземпляра объекта:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
class Circle:
def __init__(self, radius):
self.radius = radius
c = Circle(2)
r = Rectangle(3, 4)
if type(r) is type(c):
print("Типы объектов совпадают")
else:
print("Типы объектов не совпадают")
# Типы объектов не совпадают
Сравнение со встроенными типами.
Для
сравнения типов переменных/объектов со
встроенными типами Python лучше всего использовать
функцию isinstance
, так как она поддерживает наследование (экземпляр производного класса также является экземпляром базового класса), а проверка на равенство типов - нет (требуется идентичность типов и отклоняет экземпляры подтипов, также называемых подклассами).
Встроенная функция isinstance
возвращает не тип объекта, а True
в случае успеха, к тому же isinstance
может сравнивать определенный тип с несколькими ожидаемыми типами.
class MyList(list):
pass
lst = MyList('test')
print(lst)
# ['t', 'e', 's', 't']
# Наилучшая практика
if isinstance(lst, list):
print('Это список')
else:
print('Это НЕ список')
Заметьте, использование
isinstance
- это не панацея, а по крайней мере лучше, чем просто проверка типов на равенство. Предпочтительное
Pythonic решение почти всегда "
утиная типизация".