Module (64%)
Section (22%)

Наследование: isinstance()

Как Вы уже знаете, объект является воплощением класса. Это означает, что объект похож на торт, испеченный по рецепту, который включен в класс.

Это может вызвать некоторые важные проблемы.

Давайте предположим, что у Вас есть торт (например, в качестве аргумента, переданного вашей функции). Вы хотите знать, какой рецепт был использован для его приготовления. Зачем? Потому что Вы хотите знать, чего от него ожидать, например, содержит ли он орехи или нет, что является важной информацией для некоторых людей.

Точно так же это может иметь решающее значение, если объект имеет (или не имеет) определенные характеристики. Другими словами, является ли он объектом определенного класса или нет.

Этот факт может быть обнаружен функцией с именем isinstance():

isinstance(objectName, ClassName)

Функция возвращает True, если объект является экземпляром класса, или False в противном случае.

Наличие экземпляра класса означает, что объект (торт) был приготовлен с использованием рецепта, содержащегося либо в классе, либо в одном из его суперклассов.

Не забывайте: если подкласс содержит хотя бы то же оборудование, что и любой из его суперклассов, это означает, что объекты подкласса могут делать то же самое, что и объекты, производные от суперкласса, т.е. это экземпляр его домашнего класса и любой из его суперклассов.

Давайте проверим это. Проанализируйте код в редакторе.

Мы создали три объекта, по одному для каждого из классов. Затем, используя два вложенных цикла, мы проверяем все возможные пары объектов-классов, чтобы выяснить, являются ли объекты экземплярами классов.

Запустите код.

Вот что мы получаем:

True False False True True False True True True

output

Давайте сделаем результат еще более читабельным:

↓ Наследование от → Vehicle LandVehicle TrackedVehicle
myVehicle True False False
myLandVehicle True True False
myTrackedVehicle True True True

Таблица подтверждает наши ожидания?



Code

class Vehicle:
pass


class LandVehicle(Vehicle):
pass


class TrackedVehicle(LandVehicle):
pass


my_vehicle = Vehicle()
my_land_vehicle = LandVehicle()
my_tracked_vehicle = TrackedVehicle()

for obj in [my_vehicle, my_land_vehicle, my_tracked_vehicle]:
for cls in [Vehicle, LandVehicle, TrackedVehicle]:
print(isinstance(obj, cls), end="\t")
print()
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×