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

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

Відкрита

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 лекція
Недоступна
Автопарк.
Автопарк.
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.