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() часто використовується в метапрограмуванні та при написанні коду, який працює з динамічними типами і класами. Про це ми з вами поговоримо ще не скоро :)
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ