JavaRush /Курсы /Модуль 1: Python Core /Проверка типов

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

Модуль 1: Python Core
9 уровень , 8 лекция
Открыта

9.1 Функция type()

В Python есть несколько встроенных функций для проверки типов и классов объектов. Эти функции полезны для написания гибкого и безопасного кода, который может работать с различными типами данных.

Ниже я расскажу о самых популярных из них: type(), isinstance(), issubclass(), а также функциях для аннотации типов, таких как getattr() и hasattr().

Функция type()

Функция type() возвращает тип объекта. Вы с ней уже работали, не так ли?


x = 10
print(type(x))  # Output: <class 'int'>

Но вот чего вы, наверное, не знаете, так это то, что с ее помощью можно создавать новые классы!

Создание нового класса

Если передать в нее три аргумента, то она создаст новый тип (класс).

Сигнатура этой операции:


type(name, bases, dict)

где:

  • name — имя создаваемого класса (строка).
  • bases — кортеж базовых классов (родителей), от которых наследуется новый класс.
  • dict — словарь, содержащий атрибуты и методы нового класса.

Создание простого класса:


MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# Создаем экземпляр класса
instance = MyClass()
instance.say_hello()  # Output: Hello!

Можно даже создать что-то посложнее:


MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})
            
# Создаем экземпляр класса
instance = MyClass(10)
print(instance.attribute)  # Output: 42
instance.display_value()  # Output: 10

Так что теперь вы можете не просто определять тип объекта, но и создать класс, наделать ему объектов, а потом определять их типы.

9.2 Функция isinstance()

Функция isinstance() является встроенной функцией в Python, используемой для проверки принадлежности объекта к определенному классу или кортежу классов. Она возвращает True, если объект является экземпляром указанного класса или любого из указанных классов в кортеже, и False в противном случае.

Сигнатура и параметры:


isinstance(object, classinfo)

где:

  • object — объект, принадлежность которого к классу или классам нужно проверить.
  • classinfo — класс, тип или кортеж классов и типов, против которых будет проверяться объект.

Примеры использования:

Проверка принадлежности к одному классу


x = 10
print(isinstance(x, int))  # Output: True
            
y = "Hello"
print(isinstance(y, str))  # Output: True

Проверка принадлежности к нескольким классам — хотя бы одному из:


x = 10
print(isinstance(x, (int, float)))  # Output: True
            
y = "Hello"
print(isinstance(y, (int, str)))  # Output: True
            
z = 3.14
print(isinstance(z, (int, str)))  # Output: False

Проверка принадлежности к пользовательским классам


class Animal:
    pass
        
class Dog(Animal):
    pass
        
dog = Dog()
        
print(isinstance(dog, Dog))  # Output: True
print(isinstance(dog, Animal))  # Output: True

В отличие от прямого сравнения типов с помощью type(), isinstance() корректно работает с наследованием, проверяя принадлежность объекта к любому классу в иерархии.

9.3 Функция issubclass()

Функция issubclass() является встроенной функцией в Python, которая используется для проверки, является ли указанный класс подклассом другого класса или любого из классов в кортеже. Эта функция возвращает True, если первый аргумент действительно является подклассом второго, и False в противном случае.

Сигнатура и параметры:


issubclass(class, classinfo)

где:

  • class — класс, принадлежность которого к классу или классам необходимо проверить.
  • classinfo — класс, тип или кортеж классов и типов, против которых будет проверяться первый аргумент.

Примеры использования:

Проверка принадлежности к одному классу



class Animal:
    pass
         
class Dog(Animal):
    pass
        
print(issubclass(Dog, Animal))  # Output: True
print(issubclass(Animal, Dog))  # Output: False 

Проверка принадлежности к нескольким классам — хотя бы одному:


class Animal:
    pass
        
class Dog(Animal):
    pass
        
class Cat(Animal):
    pass
        
print(issubclass(Dog, (Animal, Cat)))  # Output: True
print(issubclass(Dog, (Cat,)))  # Output: False

Примеры с пользовательскими классами

Наследование от встроенных классов


class MyInt(int):
    pass
        
print(issubclass(MyInt, int))  # Output: True
print(issubclass(int, MyInt))  # Output: False

Иерархия наследования


class A:
    pass
        
class B(A):
    pass
        
class C(B):
    pass
        
print(issubclass(C, A))  # Output: True
print(issubclass(C, B))  # Output: True
print(issubclass(B, A))  # Output: True
print(issubclass(A, C))  # Output: False

Преимущества использования issubclass()

Проверка иерархии классов: issubclass() позволяет проверять иерархию классов, что полезно для обеспечения правильности наследования и структуры кода.

Гибкость: Функция поддерживает проверку и одного класса или кортежа классов, что делает ее гибкой для использования в различных сценариях.

Удобство для метапрограммирования: issubclass() часто используется в метапрограммировании и при написании кода, который работает с динамическими типами и классами. Об этом мы с вами поговорим еще не скоро :)

2
Задача
Модуль 1: Python Core, 9 уровень, 8 лекция
Недоступна
Домашние животные.
Домашние животные.
2
Задача
Модуль 1: Python Core, 9 уровень, 8 лекция
Недоступна
Автопарк.
Автопарк.
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
SWK Уровень 26
7 апреля 2025

classinfo — класс, тип или кортеж классов и типов, против которых будет проверяться объект.
Первый раз встречаю словосочетание "проверяться против". Хорошие грибы.
Александр Уровень 19 Expert
16 марта 2025
замечание - в начале лекции нам пишут: "Ниже я расскажу о самых популярных из них: type(), isinstance(), issubclass(), а также функциях для аннотации типов, таких как getattr() и hasattr()." а пример двумя абзацами ниже дают с setattr()
Azat Rashitov Уровень 31
10 января 2025
Про то, что с type можно создать новый класс - не знал. Интересно!