Код ниже использует шаблон 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()
- это класс всех классов в языке Python и является собственным метаклассом языка Python.
# 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 решение почти всегда "утиная типизация".