Система типов и объектная модель

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

Ключевые свойства объектов:

  • тип
  • значение
  • идентичность
Типизация
Типизация - совокупность правил, назначающих типы конструкциям, составляющим программу: переменным, выражениям, функциям, модулям.

Типизация бывает:

  • статическая или динамическая
  • слабая или сильная
Статическая типизация

  1. Переменные связываются с типами в момент объявления.
  2. Типы проверяются во время компиляции.
  3. Тип не может быть изменен позже.
int x = 42;
x = "text";  // Ошибка компиляции, т.к. пытается присвоить строку целочисленной переменной
Динамическая типизация

  1. Переменная связывается с типом в момент присваивания.
  2. Типы проверяются во время выполнения.
  3. Переменная может принимать значения разных типов.
x = 42
x = 'text'
Слабая типизация
  1. Существует механизм неявного преобразования типов.
  2. Операции могут выполняться между значениями разных типов: типы будут автоматически преобразованы в совместимые.
console.log(3 + "2");  // "32"
console.log(3 - "2");  // 1
Сильная типизация
  1. Отсутствует механизм неявного преобразования типов.
  2. Операции могут выполняться между значениями разных типов: в случае несовместимости типов произойдет ошибка.
print(3 + 2)
print(3 + '2')
Типы объектов
Каждый объект в Python имеет свой тип. Для того, чтобы узнать тип объекта, используется функция type:
a = 42
print(type(a))
Также можно сравнить тип объекта с определенным типом. Для этого используется функция isinstance:
a = 42
print(isinstance(a, int))  # Проверяем, что переменная 'a' имеет тип 'int'
print(isinstance(a, str))
Все объекты в Python неявно наследуются от базового типа object:
print(isinstance(12345, object))
print(isinstance('foo', object))
print(isinstance(type, object))
print(isinstance(object, object))
Ссылочная идентичность
Переменные в Python хранят не сами объекты, а ссылки на них и в некотором роде являются именами объектов.

Все объекты обладают ссылочной идентичностью, т.е. одна и та же ссылка не может указывать на несколько объектов, а каждый объект можно отличить от других. Для этого используется функция id и оператор is. Функция id возвращает уникальный идентификатор объекта, а оператор is сравнивает идентификаторы двух объектов.

a = 1
b = 2
print(id(a))
print(id(b))
print(a is b)  # print(id(a) == id(b))
При присваивании переменной нового значения обновляется только ссылка на объект, сам объект не изменяется. Если присвоить одной переменной значение другой, то они будут ссылаться на один и тот же объект.
a = 1
b = a
print(id(a))
print(id(b))
print(a is b)