Как вывести название класса 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:
Что происходит при создании объекта с помощью класса?
При создании объекта класса Rectangle запускается конструктор выбранного класса, и атрибутам нового объекта передаются значения аргументов. Как на этом изображении:
Конструктор с аргументами по умолчанию
В других языках программирования конструкторов может быть несколько. В 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? Например:
На самом деле я создаю список функций, которые я могу указать с помощью командной строки.
Я получаю имя функции из командной строки и хочу вызвать соответствующую функцию:
Таким образом, мне нужно написать имена функций только один раз.
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, которым они должны быть:
Или, что эквивалентно:
На самом деле это невозможно, так как может быть несколько переменных, имеющих одно и то же значение, или значение может не иметь переменной, или значение может иметь то же значение, что и переменная, только случайно.
Если вы действительно хотите это сделать, вы можете использовать
Однако было бы лучше, если бы вы сначала перебирали имена: