Как в Python проверить, является ли объект экземпляром класса или его подкласса

Ответ

В Python для проверки принадлежности объекта к классу или проверки наследования классов используются встроенные функции isinstance() и issubclass().

1. isinstance(object, classinfo)

Проверяет, является ли object экземпляром класса classinfo или любого из его дочерних классов.

  • object: проверяемый объект.
  • classinfo: класс, кортеж классов или типов.

Когда использовать: Это основной способ для проверки типа объекта в рантайме.

2. issubclass(class, classinfo)

Проверяет, является ли class дочерним классом classinfo. Важно, что эта функция работает с классами, а не с их экземплярами.

  • class: проверяемый класс.
  • classinfo: родительский класс или кортеж классов.

Когда использовать: При работе с иерархиями классов, например, в метапрограммировании или при построении архитектуры фреймворков.

Пример

class Animal:
    pass

class Cat(Animal):
    pass

class Dog(Animal):
    pass

# Создаем экземпляры
my_cat = Cat()

# --- Проверка с isinstance() ---

# my_cat является экземпляром Cat?
print(f"isinstance(my_cat, Cat): {isinstance(my_cat, Cat)}")  # True

# my_cat является экземпляром родительского класса Animal?
print(f"isinstance(my_cat, Animal): {isinstance(my_cat, Animal)}") # True

# my_cat является экземпляром Dog?
print(f"isinstance(my_cat, Dog): {isinstance(my_cat, Dog)}")    # False

# --- Проверка с issubclass() ---

# Класс Cat является подклассом Animal?
print(f"issubclass(Cat, Animal): {issubclass(Cat, Animal)}")  # True

# Класс Animal является подклассом Cat?
print(f"issubclass(Animal, Cat): {issubclass(Animal, Cat)}")  # False

Ответ 18+ 🔞

Эй, ты, смотри сюда, я тебе сейчас про питоновские проверки типов расскажу, а то у тебя там в голове, наверное, каша, как в моей после вчерашнего. Есть две главные функции, которые тебе надо знать, чтобы не выглядеть полным мудаком, когда пытаешься понять, кто есть кто в этом зоопарке классов.

Первая — isinstance(объект, инфокласс).
Эта штука смотрит на конкретный объект и говорит: «А ты, сука, случаем не из этого класса? Или, может, из его детей?». Она как строгий отец на пороге: «Ты чей?». Передаёшь ей объект и класс (или даже кортеж классов, если ты такой умный), а она тебе — True или False. Используй её, когда тебе нужно в рантайме понять, с кем имеешь дело, а не гадать на кофейной гуще.

Вторая — issubclass(класс, инфокласс).
А вот это уже для умников, которые копаются в иерархиях. Она работает не с объектами, а с самими классами. Спрашивает: «А этот класс — сын этого класса? Или внук?». Если ты пишешь какой-нибудь фреймворк или метапрограммируешь, то это твой инструмент. А так — обычному смертному нахуй не сдалась.

Смотри, как это работает на живых примерах, а то я вижу, у тебя глаза уже стекленеют.

class Животное:
    pass

class Кошка(Животное):
    pass

class Собака(Животное):
    pass

# Создаём зверушку
мой_кот = Кошка()

# --- Ты чей, мальчик? (isinstance) ---

# Мой кот — кошка?
print(f"isinstance(мой_кот, Кошка): {isinstance(мой_кот, Кошка)}")  # True, ёпта

# Мой кот — животное? (ну, он же наследник)
print(f"isinstance(мой_кот, Животное): {isinstance(мой_кот, Животное)}") # True, блядь

# Мой кот — собака? (вот тут уже пиздец)
print(f"isinstance(мой_кот, Собака): {isinstance(мой_кот, Собака)}")    # False, нахуй

# --- А ты чей сын? (issubclass) ---

# Класс Кошка — дитё класса Животное?
print(f"issubclass(Кошка, Животное): {issubclass(Кошка, Животное)}")  # True, всё логично

# Класс Животное — дитё класса Кошка? (это уже какая-то мутация)
print(f"issubclass(Животное, Кошка): {issubclass(Животное, Кошка)}")  # False, охуеть, да?

Вот и вся магия. Главное — не путай их, а то получишь TypeError и будешь сидеть, чесать репу, как тот Герасим, который только «Му-му» сказать мог.