Как получить имя класса python?
бесит уже это, вто рой час туплю. в логах у меня вместо нормального названия вылезает вот это с угловыми ско бками и адресом, строк 140 таких подряд. type() пробовал, выводит то же самое.
Ваш вопрос
бесит уже это, вто рой час туплю. в логах у меня вместо нормального названия вылезает вот это с угловыми ско бками и адресом, строк 140 таких подряд. type() пробовал, выводит то же самое.
Ядро ответа умещается в одну строку: obj.class.name — и это возвращает имя класса объекта как обычную строку python.
Разберём почему именно так. У каждого объекта в python есть атрибут class, который ссылается на класс, экземпляром которого объект является. У самого класса, в свою очередь, есть атрибут name — короткое имя без пути к модулю. Соединяя два обращения подряд, получаешь просто имя класса.
Вариант type(obj).name работает так же, потому что type(obj) и obj.class в подавляющем большинстве случаев возвращают одно и то же — сам класс объекта. Разница между ними всплывает только в редких случаях с метаклассами или когда class переопределён вручную, что на практике у новичка почти не встретится.
Частая путаница — попытка распечатать сам type(obj) без name и удивление, что в выводе строка вида class 'main.Название', а не короткое имя. Это не строка с именем, а представление объекта класса целиком, name достаёт из него именно нужный кусок.
Если нужно ещё и имя модуля, где класс определён, добавляй module: f'{obj.class.module}.{obj.class.name}' даст что-то вроде myapp.models.User.
Отдельно стоит сказать про isinstance вместо сравнения имён классов строками: если задача — проверить принадлежность к классу, а не получить текст для лога, сравнение по имени класса строкой ненадёжно, лучше сравнивать сам класс через isinstance или сравнение class напрямую, потому что два разных класса в разных модулях вполне могут называться одинаково.
Вывод: чтобы получить имя класса объекта в виде строки, используй type(объект).name или объект.class.name.
Причина путаницы: type(объект) возвращает не строку, а сам класс как объект, поэтому при выводе в консоль видно что-то вроде <class 'main.MyClass'>, а не просто MyClass. Атрибут name есть у самого класса и достаёт из него именно короткое имя без пути модуля.
Если нужно имя с полным путём модуля, добавь ещё module: f'{объект.class.module}.{объект.class.name}'.
Проверь у себя: если объект — это экземпляр, а не сам класс, обращайся через class, а не пытайся вызвать name напрямую у экземпляра, у него такого атрибута нет.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Лучший ответ
4.1 Fast
4.1 Fast
Как получить имя класса python?
Коротко: obj.class.name.
Что это даёт: строку с именем класса, без модуля и адреса в памяти, удобно сразу пихать в лог или сообщение.
Частая ошибка: пишут type(obj) и удивляются, что вывелось не то — там объект класса целиком, а не строка, имя надо доставать отдельно через name.