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

Какой жизненный цикл объекта в Python?

1.7 Middle🔥 161 комментариев
#Python Core

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

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

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

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

Жизненный цикл объекта в Python состоит из четырёх основных этапов: создание, инициализация, использование и удаление. Каждый этап контролируется специальными методами и механизмом управления памятью.

Этапы жизненного цикла

1. Выделение памяти (new)

Первый этап — выделение памяти под новый объект. Метод __new__ вызывается перед инициализацией и отвечает за создание экземпляра класса:

class Person:
    def __new__(cls, name, age):
        print(f"__new__ вызван для {cls.__name__}")
        instance = super().__new__(cls)
        return instance
    
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 30)

2. Инициализация (init)

После выделения памяти вызывается метод __init__, который инициализирует атрибуты объекта:

class Car:
    def __init__(self, brand, model):
        print(f"Инициализация {brand} {model}")
        self.brand = brand
        self.model = model

car = Car("Toyota", "Camry")

3. Использование объекта

На этом этапе объект активно используется: вызываются его методы, обращаются к атрибутам:

class Calculator:
    def __init__(self, initial=0):
        self.value = initial
    
    def add(self, x):
        self.value += x
        return self.value

calc = Calculator(10)
print(calc.add(5))

4. Удаление объекта (del)

Когда на объект больше не ссылаются никакие переменные, Python удаляет его из памяти. Перед удалением вызывается деструктор __del__:

class Resource:
    def __init__(self, name):
        self.name = name
        print(f"Ресурс '{name}' открыт")
    
    def __del__(self):
        print(f"Ресурс '{self.name}' закрыт")

r = Resource("file.txt")
del r

Управление памятью: подсчёт ссылок

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

import sys

class MyObject:
    pass

obj = MyObject()
print(sys.getrefcount(obj))

obj_ref = obj
print(sys.getrefcount(obj))

Контекстные менеджеры (with statement)

Для автоматического управления ресурсами используются контекстные менеджеры:

class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
    
    def __enter__(self):
        print(f"Открываем файл {self.filename}")
        self.file = open(self.filename, self.mode)
        return self.file
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"Закрываем файл {self.filename}")
        if self.file:
            self.file.close()
        return False

with FileManager("data.txt", "r") as f:
    content = f.read()

Сборка мусора (garbage collection)

Кроме подсчёта ссылок, Python имеет сборщик мусора для обнаружения циклических ссылок:

import gc

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1

del node1
del node2

gc.collect()
print("Циклические ссылки удалены")

Жизненный цикл объекта в Python — это стройная система, которая автоматически управляет созданием, использованием и удалением объектов благодаря встроенному механизму подсчёта ссылок и сборке мусора.