Объекты и атрибуты

Часто можно услышать, что в Python всё является объектом, и это правда. Но что такое объект? И из чего складывается это "всё"?

Когда переменных в коде становится много, их объединяют в группы — объекты. Добраться до переменной, прикрепленной к объекту можно через точку .. Выглядит это похоже на вызов метода. Для сравнения, вызовем метод __len__ и вычислим длину строки:

print('строка это тоже объект'.__len__())  # выведет 22

А теперь узнаем значение прикрепленной переменной __class__. Она хранит тип данных и имеется у любого объекта в Python, в том числе у строки:

print('строка это тоже объект'.__class__)  # выведет <class 'str'>

В этот раз мы заменили __len__ на __class__ и не поставили круглые скобки (), на этом отличия заканчиваются. Прикрепленные переменные и прикрепленные функции — методы — имеют так много общего, что вместе их называют атрибутами.

Объект — это набор атрибутов: прикрепленных переменных и функций. До любого атрибута можно добраться через точку .:

print('строка это тоже объект'.__len__)  # выведет <method...>
print('строка это тоже объект'.__class__)  # выведет <class 'str'>
print('строка это тоже объект'.__doc__)  # выведет документацию по типу данных Строка

Объекты в Python встречаются повсюду и у всех них есть атрибуты. Строки, числа, функции и даже модули — все это объекты, а значит у них есть атрибут __class__:

print(''.__class__)  # выведет <class 'str'>

number = 1
print(number.__class__)  # выведет <class 'int'>

print(print.__class__)  # выведет <class 'builtin_function_or_method'>

import os  # подключаем стандартный модуль os
print(os.__class__)  # выведет <class 'module'>

Чтобы не писать каждый раз длинное название __class__ используют функцию type(). Она умеет работать с любыми данными, благодаря тому что сама обращается к атрибуту __class__:

print(type(''))  # выведет <class 'str'>

print(type(1))  # выведет <class 'int'>

print(type(print))  # выведет <class 'builtin_function_or_method'>

import os  # подключаем стандартный модуль os
print(type(os))  # выведет <class 'module'>