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() часто використовується в метапрограмуванні та при написанні коду, який працює з динамічними типами і класами. Про це ми з вами поговоримо ще не скоро :)

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ