Как проверить, что объект класса является потомком другого класса?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверка наследования классов в 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 подход.