← Назад к вопросам

Откуда берется объект в Python

2.0 Middle🔥 71 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Откуда берется объект в Python

В Python всё является объектом. Это не просто слова — это фундаментальная архитектурная особенность языка. Давайте разберёмся, откуда берутся объекты и как они создаются.

Иерархия объектов

Вершина иерархии — класс object. Он встроен в Python и служит базовым классом для всех остальных объектов:

class MyClass:
    pass

obj = MyClass()
print(isinstance(obj, object))  # True
print(type(obj))  # <class __main__.MyClass>
print(MyClass.__bases__)  # (<class object>,)

Когда вы создаёте класс без явного наследования, Python автоматически делает его наследником object.

Создание объекта: процесс

Когда вы вызываете MyClass(), происходит следующее:

  1. Вызов __new__() — выделяет память для нового объекта. Это метод класса, который создаёт пустой экземпляр.
  2. Вызов __init__() — инициализирует атрибуты объекта.
class Point:
    def __new__(cls, x, y):
        print(f"__new__ вызван для {cls}")
        instance = super().__new__(cls)  # Создаём экземпляр
        return instance
    
    def __init__(self, x, y):
        print(f"__init__ вызван для {self}")
        self.x = x
        self.y = y

point = Point(3, 4)  # Сначала __new__, затем __init__

Встроенные типы

Любое значение в Python — это объект, созданный интерпретатором:

print(type(42))  # <class int>
print(type("hello"))  # <class str>
print(type([1, 2, 3]))  # <class list>
print(type({"key": "value"}))  # <class dict>

# Даже функции — объекты
def func():
    pass

print(type(func))  # <class function>
print(isinstance(func, object))  # True

Метаклассы: создатели объектов

Когда вы определяете класс, Python использует метакласс для его создания. По умолчанию это type:

class MyClass:
    x = 10

print(type(MyClass))  # <class type>

# Это эквивалентно:
MyClass2 = type(MyClass2, (object,), {x: 10})
print(MyClass2.x)  # 10

Метаклассы можно кастомизировать:

class Meta(type):
    def __new__(mcs, name, bases, namespace):
        print(f"Создаю класс {name}")
        return super().__new__(mcs, name, bases, namespace)

class MyClass(metaclass=Meta):
    pass

# Вывод: Создаю класс MyClass

##池址: память и идентификация

Каждый объект занимает место в памяти. Можно получить его адрес через id():

obj1 = [1, 2, 3]
obj2 = [1, 2, 3]
obj3 = obj1

print(id(obj1))  # Уникальный адрес в памяти
print(id(obj2))  # Другой адрес (разные объекты)
print(id(obj3))  # Тот же адрес, что obj1 (один объект)
print(obj1 is obj3)  # True — один объект
print(obj1 == obj2)  # True — равные значения, но разные объекты

Литерали и интернирование

Для оптимизации Python интернирует (переиспользует) некоторые объекты:

# Целые числа от -5 до 256 интернируются
a = 256
b = 256
print(a is b)  # True

c = 257
d = 257
print(c is d)  # False (обычно)

# Строки тоже интернируются
s1 = "hello"
s2 = "hello"
print(s1 is s2)  # True

Жизненный цикл объекта

class Resource:
    def __init__(self, name):
        print(f"Создание {name}")
        self.name = name
    
    def __del__(self):
        print(f"Удаление {self.name}")

obj = Resource("my_obj")
# Вывод: Создание my_obj

del obj
# Вывод: Удаление my_obj

Заключение

Объекты в Python — это не абстракция, а конкретная реальность:

  • Все объекты наследуют от object
  • Классы создаются через метаклассы (по умолчанию type)
  • Экземпляры создаются через __new__() и __init__()
  • Каждый объект имеет уникальный адрес в памяти и тип
  • Сборщик мусора удаляет объекты, когда на них нет ссылок

Понимание этого механизма критично для работы с Python на продвинутом уровне и отладки сложных проблем с памятью.

Откуда берется объект в Python | PrepBro