Как вывести название класса python

Получить полное имя класса объекта в Python

для целей ведения журнала я хочу получить полное имя класса объекта Python. (С полной квалификацией я имею в виду имя класса, включая имя пакета и модуля.)

9 ответов

со следующей программой

и Bar определяется как

предоставленные ответы не касаются вложенных классов. Хотя он недоступен до Python 3.3 (PEP 3155), вы действительно хотите использовать __qualname__ класса. В конце концов (3.4? PEP 395), __qualname__ также будет существовать для модулей для решения случаев, когда модуль переименован (т. е. когда он переименован в __main__ ).

рассмотрите возможность использования inspect модуль, который имеет такие функции, как getmodule что может быть что ищем:

вот один, основанный на отличном ответе Грега Бэкона, но с парой дополнительных проверок:

__module__ может быть None (согласно документам), а также для типа str может быть __builtin__ (который вы, возможно, не хотите появляться в журналах или что-то еще). Следующие проверки для обеих этих возможностей:

__module__ будет делать трюк.

этот сайт говорит о том, что __package__ может работать для Python 3.0; однако приведенные примеры не будут работать под моей консолью Python 2.5.2.

это хак, но я поддерживаю 2.6 и просто нужно что-то простое:

поскольку интерес этой темы заключается в получении полных имен, вот ловушка, которая возникает при использовании относительного импорта вместе с основным модулем, существующим в том же пакете. Например, с приведенной ниже настройкой модуля:

вот результат, показывающий результат импорта одного и того же модуля по-разному:

когда Hum импортирует бар, используя относительный путь, бар видит Baz.__module__ Как только «баз», но во втором импорте, который использует полное имя, бар видит то же самое как » Фу.baz.»

Если вы где-то сохраняете полные имена, лучше избегать относительного импорта для этих классов.

ни один из ответов здесь работал для меня. В моем случае я использовал Python 2.7 и знал, что буду работать только с newstyle object классы.

заметьте, он также работает правильно для buildins:

Источник

Python получить имя класса

Итак, у меня есть проблема, я хочу получить имя класса Python следующим образом:

Но это имеет большую проблему, потому что я не могу получить имя класса, пока не создаю его экземпляр, я настаиваю на создании нескольких гигабайт данных для каждого экземпляра класса, который будет сохранен в saveDirectory, поэтому он может использовать повторно позже. Так что я на самом деле не хочу идти дальше с моим текущим решением.

Есть ли способ получить имя класса, как я задумал? Или я просто сплю?

Спасибо, ребята, за ваши отличные предложения. Я собираюсь потратить немного времени на изучение метаклассов. В противном случае я, вероятно, создам словарь глобально и вместо этого буду ссылаться на эти экземпляры классов.

6 ответов

Это определенно менее понятно, чем просто использование следующего:

Просто использовать метод?

Или у вас может быть атрибут класса, указывающий каталог сохранения; меньше магии, как правило, хорошо. Кроме того, вы можете изменить имя класса позже, не нарушая хранилища.

Кроме того, что? Гигабайт?!

Я думаю, что то, что вы делаете, невозможно, потому что класс даже не существует, когда вы делаете:

myName = (get class name here automatically)

Но вскоре после того, как класс был интерпретирован, вы можете передать объект класса другой функции сделать работу за вас.

С другой стороны, если вам действительно нужно имя класса из внутри тела класса (маловероятно), вы можете отслеживать стек вызовов. Имя класса, как оно выглядит в исходном коде, находится на объекте кода, выполняемого по определению класса:

Из представленных на данный момент только этот последний позволяет использовать имя в виде строки внутри тела класса. К сожалению, это работает не во всех версиях Python. в частности, IronPython не реализует самоанализ стека вызовов, так как он не доступен в DLR.

Начиная с python 3.3, вы можете использовать __qualname__ переменная:

Источник

Примеры работы с классами в Python

Python — объектно-ориентированный язык с начала его существования. Поэтому, создание и использование классов и объектов в Python просто и легко. Эта статья поможет разобраться на примерах в области поддержки объектно-ориентированного программирования Python. Если у вас нет опыта работы с объектно-ориентированным программированием (OOП), ознакомьтесь с вводным курсом или учебным пособием, чтобы понять основные понятия.

Создание классов

Пример создания класса на Python:

Создание экземпляров класса

Доступ к атрибутам

Теперь, систематизируем все.

При выполнении этого кода, мы получаем следующий результат:

Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любой момент.

Вместо использования привычных операторов для доступа к атрибутам вы можете использовать эти функции:

Встроенные атрибуты класса

Для вышеуказанного класса давайте попробуем получить доступ ко всем этим атрибутам:

Когда этот код выполняется, он возвращает такой результат:

Удаление объектов (сбор мусора)

Python автоматически удаляет ненужные объекты (встроенные типы или экземпляры классов), чтобы освободить пространство памяти. С помощью процесса ‘Garbage Collection’ Python периодически восстанавливает блоки памяти, которые больше не используются.

Сборщик мусора Python запускается во время выполнения программы и тогда, когда количество ссылок на объект достигает нуля. С изменением количества обращений к нему, меняется количество ссылок.

Пример работы __del__()
Деструктор __del__() выводит имя класса того экземпляра, который должен быть уничтожен:

Когда вышеуказанный код выполняется и выводит следующее:

Наследование класса в python

Наследование — это процесс, когда один класс наследует атрибуты и методы другого. Класс, чьи свойства и методы наследуются, называют Родителем или Суперклассом. А класс, свойства которого наследуются — класс-потомок или Подкласс.

Вместо того, чтобы начинать с нуля, вы можете создать класс, на основе уже существующего. Укажите родительский класс в круглых скобках после имени нового класса.

Класс наследник наследует атрибуты своего родительского класса. Вы можете использовать эти атрибуты так, как будто они определены в классе наследнике. Он может переопределять элементы данных и методы родителя.

Синтаксис наследования класса

Классы наследники объявляются так, как и родительские классы. Только, список наследуемых классов, указан после имени класса.

Источник

Класс и объект в Python

Объектно-ориентированное программирование в Python

Python — это процедурно-ориентированный и одновременно объектно-ориентированный язык программирования.

Процедурно-ориентированный

«Процедурно-ориентированный» подразумевает наличие функций. Программист может создавать функции, которые затем используются в сторонних скриптах.

Объектно-ориентированный

«Объектно-ориентированный» подразумевает наличие классов. Есть возможность создавать классы, представляющие собой прототипы для будущих объектов.

Создание класса в Python

Синтаксис для написания нового класса:

Атрибут:

Атрибут — это элемент класса. Например, у прямоугольника таких 2: ширина ( width ) и высота ( height ).

Метод:

Конструктор:

Создание объекта с помощью класса Rectangle:

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Что происходит при создании объекта с помощью класса?

При создании объекта класса Rectangle запускается конструктор выбранного класса, и атрибутам нового объекта передаются значения аргументов. Как на этом изображении:

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Конструктор с аргументами по умолчанию

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

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

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Сравнение объектов

В Python объект, созданный с помощью конструктора, занимает реальное место в памяти. Это значит, что у него есть точный адрес.

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Атрибуты

В Python есть два похожих понятия, которые на самом деле отличаются:

Стоит разобрать на практике:

Атрибут

Объекты, созданные одним и тем же классом, будут занимать разные места в памяти, а их атрибуты с «одинаковыми именами» — ссылаться на разные адреса. Например:

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Атрибуты функции

Обычно получать доступ к атрибутам объекта можно с помощью оператора «точка» (например, player1.name ). Но Python умеет делать это и с помощью функции.

ФункцияОписание
getattr (obj, name[,default])Возвращает значение атрибута или значение по умолчанию, если первое не было указано
hasattr (obj, name)Проверяет атрибут объекта — был ли он передан аргументом «name»
setattr (obj, name, value)Задает значение атрибута. Если атрибута не существует, создает его
delattr (obj, name)Удаляет атрибут

Встроенные атрибуты класса

Объекты класса — дочерние элементы по отношению к атрибутам самого языка Python. Таким образом они заимствуют некоторые атрибуты:

Переменные класса

Переменные класса в Python — это то же самое, что Field в других языках, таких как Java или С#. Получить к ним доступ можно только с помощью имени класса или объекта.

Для получения доступа к переменной класса лучше все-таки использовать имя класса, а не объект. Это поможет не путать «переменную класса» и атрибуты.

У каждой переменной класса есть свой адрес в памяти. И он доступен всем объектам класса.
Как вывести название класса python. Смотреть фото Как вывести название класса python. Смотреть картинку Как вывести название класса python. Картинка про Как вывести название класса python. Фото Как вывести название класса python

Составляющие класса или объекта

Источник

Как я могу получить имя объекта в Python?

Есть ли способ получить имя объекта в Python? Например:

На самом деле я создаю список функций, которые я могу указать с помощью командной строки.

Я получаю имя функции из командной строки и хочу вызвать соответствующую функцию:

Таким образом, мне нужно написать имена функций только один раз.

15 ответов

Объекты не обязательно имеют имена в python, поэтому вы не можете получить имя. Обычно объекты имеют атрибут __name__ в тех случаях, когда у них есть имя, но это не является частью стандартного python, и большинство встроенных типов не имеют его.

Когда вы создаете переменную, такую как x, y, z выше, эти имена просто действуют как «указатели» или «ссылки» на объекты. Сам объект не знает, какое имя вы используете для него, и вы не можете легко (если вообще) получить имена всех ссылок на этот объект.

Обновление: однако функции имеют __name__ (если они не лямбда-выражения), поэтому в этом случае вы можете сделать:

Вот мой ответ, я также использую globals (). Items ()

Я добавил исключение_ слова, потому что я хочу отфильтровать слово, используемое в цикле for. Если вы не добавили его, ключевое слово в цикле for может запутать эту функцию, иногда ключевое слово «each_item» в следующем случае может отображаться в результате функции, в зависимости от того, что вы сделали с вашим циклом.

Надеюсь, это поможет.

Вы определяете class и добавляете приватную функцию Unicode, вставляете class как

Я наткнулся на эту страницу, задаваясь вопросом о том же вопросе.

Короче говоря, вы могли бы использовать модуль inspect, чтобы сделать обоснованное предположение о том, какой это, но вам, вероятно, придется знать, в каком кадре вы работаете / пройти по стеку, чтобы найти правильный. Но я бы не хотел представить, как весело будет пытаться справиться с кодом eval / exec.

Как описано в других ответах, вы можете использовать тот же подход с globals() и обычными функциями в вашем модуле, чтобы более точно соответствовать тому, что вы просили.

Имена переменных можно найти в словах globals () и locals (). Но они не дадут вам то, что вы ищете выше. «bla» будет содержать значение каждого элемента my_list, а не переменной.

Используйте обратный дикт.

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

Для дополнительного удовольствия и безумия вы можете хранить прямое и обратное значения в одном и том же тексте. Я бы не стал этого делать, если бы вы отображали строки в строки, но если вы делаете что-то вроде ссылок на функции и строк, это не слишком безумно.

Для этого у вас есть замечательная getattr функция, которая позволяет вам получить объект под известным именем. Так что вы могли бы сделать, например:

Что должно name(e[2]) вернуть и почему?

Как уже упоминали другие, это действительно сложный вопрос. Решения для этого не «один размер подходит всем», даже удаленно. Трудность (или легкость) действительно будет зависеть от вашей ситуации.

Далее следует кое-что из того, что я придумал.

Вернуть имя функции

Вернуть первое совпадающее имя объекта

Сравните значение arg со значениями элементов в globals() и верните имя первого совпадения. Обратите внимание, что я отфильтровываю имена, начинающиеся с ‘_’.

Вернуть все совпадающие имена объектов

Этот однострочник работает для всех типов объектов, если они находятся в globals() dict, которым они должны быть:

Или, что эквивалентно:

На самом деле это невозможно, так как может быть несколько переменных, имеющих одно и то же значение, или значение может не иметь переменной, или значение может иметь то же значение, что и переменная, только случайно.

Если вы действительно хотите это сделать, вы можете использовать

Однако было бы лучше, если бы вы сначала перебирали имена:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *