← Назад к вопросам

Как проверить, что объект класса является потомком другого класса?

1.0 Junior🔥 181 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверка наследования классов в Python

Проверка того, является ли объект экземпляром класса-потомка другого класса, выполняется с помощью встроенных функций isinstance() и issubclass().

Функция isinstance()

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

class Animal:
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog()
cat = Cat()

# Проверка, является ли объект экземпляром конкретного класса
print(isinstance(dog, Dog))      # True
print(isinstance(dog, Animal))   # True — dog является потомком Animal
print(isinstance(dog, Cat))      # False — dog не является потомком Cat
print(isinstance(cat, Animal))   # True

Функция issubclass()

Эта функция проверяет, является ли класс потомком другого класса (на уровне классов, а не объектов):

print(issubclass(Dog, Animal))   # True
print(issubclass(Animal, Dog))   # False
print(issubclass(Dog, Dog))      # True — класс является «потомком» сам себе
print(issubclass(Cat, Animal))   # True

Проверка кортежа типов

Оба isinstance() и issubclass() поддерживают кортежи типов:

# Проверить, является ли объект экземпляром одного из нескольких классов
print(isinstance(dog, (Dog, Cat)))     # True
print(isinstance(dog, (Cat, str)))     # False

# Проверить, является ли класс потомком одного из нескольких классов
print(issubclass(Dog, (Animal, str)))  # True
print(issubclass(str, (Animal, int)))  # False

Проверка через атрибут __bases__

Можно также посмотреть прямых родителей класса через атрибут __bases__:

print(Dog.__bases__)          # (<class __main__.Animal>,)
print(Animal.__bases__)       # (<class object>,)

# Проверить, есть ли класс в прямых родителях
print(Animal in Dog.__bases__) # True

Проверка через MRO (Method Resolution Order)

Для более детального анализа иерархии можно использовать __mro__ (порядок разрешения методов):

print(Dog.__mro__)  # (<class Dog>, <class Animal>, <class object>)

# Проверить, есть ли класс где-то в цепи наследования
print(Animal in Dog.__mro__)  # True
print(object in Dog.__mro__)  # True

Практический пример

class Vehicle:
    def move(self):
        print("Moving")

class Car(Vehicle):
    pass

class Bicycle(Vehicle):
    pass

class Plane:
    pass

def process_vehicle(obj):
    """Функция, которая работает только с транспортом"""
    if isinstance(obj, Vehicle):
        print(f"{obj.__class__.__name__} is a vehicle")
        obj.move()
    else:
        print(f"{obj.__class__.__name__} is not a vehicle")

car = Car()
plane = Plane()

process_vehicle(car)    # Car is a vehicle. Moving
process_vehicle(plane)  # Plane is not a vehicle

Сравнение методов

СпособДля чегоПример
isinstance()Проверка объектаisinstance(obj, ParentClass)
issubclass()Проверка классаissubclass(ChildClass, ParentClass)
__bases__Прямые родителиParentClass in ChildClass.__bases__
__mro__Вся цепь наследованияParentClass in ChildClass.__mro__

Главное правило

В 99% случаев используйте isinstance() для проверки объектов и issubclass() для проверки классов. Это наиболее читаемый и pythonic подход.

Как проверить, что объект класса является потомком другого класса? | PrepBro