Наследование: 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()