🐍 Атрибуты — это фундамент объектной модели Python, но большинство новичков (и даже многие мидлы) используют их интуитивно, не понимая, что происходит "под капотом". В итоге — непредсказуемое поведение кода, пожирание оперативы и спагетти-API. Давайте разбираться в нюансах 👇 1️⃣ Порядок поиска (MRO) Python живет по принципу: сначала объект, потом класс. Когда вы обращаетесь к obj.attr, интерпретатор лезет сначала в obj.__dict__. Если не нашел — идет в Class.__dict__. Если вы случайно запишете что-то в obj.attr, вы создадите атрибут экземпляра, который скроет атрибут класса. class Hero: weapon = "Sword" h = Hero() h.weapon = "Gun" # Теперь у h свое оружие, а класс по-прежнему с мечом Это не баг, это фича, но контролируйте это. Если хотите изменить атрибут для всех — стучитесь в класс. 2️⃣ __dict__ vs __slots__ По умолчанию каждый объектdictn имеет __dict__ — хэш-таблицу (словарь), где хранятся атрибуты. Это гибко, но дорого по памяти. Если вы создаете миллионы объектов одного