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