Ответ
В 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 и будешь сидеть, чесать репу, как тот Герасим, который только «Му-му» сказать мог.