Как узнать имя класса
Перейти к содержимому

Как узнать имя класса

Получить имя класса через параметр экземпляра этого класса

Добрый день! Подскажите пожалуйста можно ли получить имя класса при обращении к параметру экземпляра этого класса?

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14
class MyClass: def __init__(self, object): self.data = object obj = [ { 'name': 'ivanov', 'last_name': 'ivan', 'age': 25 } ] instance = MyClass(obj) print(type(instance)) # print(type(instance.data)) #

Для чего все это нужно. У меня есть класс Database с методом create, который создает таблицу в БД SQLite с именем класса на основе values (список словарей), а также определяет типы данных полей таблицы. Однако имя класса берется не из экземпляра класса, а из параметра values (список).

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import sqlite3 class Database: def __init__(self): self.__conn = sqlite3.connect('sqlite_python.db', check_same_thread=False) def __del__(self): self.__conn.close() def create(self, values: list, table=None) -> None: '''Method for creating a new table. The method automatically detects data types for columns.''' types = { "": "INTEGER", "": "REAL", "": "TEXT", "": "BLOB" } query = f'''CREATE TABLE IF NOT EXISTS ( id INTEGER PRIMARY KEY AUTOINCREMENT, <','.join([key + ' ' + types[str(type(value))] for key, value in values[0].items()])>, datetime DATE NOT NULL DEFAULT (datetime('now','localtime')), UNIQUE(<','.join([key for key in values[0].keys()])>) ON CONFLICT IGNORE );''' cur = self.__conn.cursor() cur.execute(query) cur.close()

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Имя переменной экземпляра класса из строки
Есть несколько классов в модуле SQL: class DicLevel(Base): __tablename__ = ‘DicLevel’.

Не могу передать параметр в родительский конструктор при создании экземпляра класса
Хочу создать экземпляр класса Human, и передать в конструктор его родительского класса параметр.

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Murderface Посмотреть сообщение

можно ли получить имя класса при обращении к параметру экземпляра этого класса

1 2 3 4 5
>>> class Test: pass >>> test = Test() >>> test.__class.__name__ 'Test' >>>

Регистрация: 11.08.2021
Сообщений: 30

Вы получаете имя класса из экземпляра класса. Вопрос в другом, можно ли получить имя класса из параметра экземпляра класса (см. первый спойлер)?

Эксперт Python

4615 / 2036 / 359
Регистрация: 17.03.2012
Сообщений: 10,103
Записей в блоге: 6

ЦитатаСообщение от Murderface Посмотреть сообщение

имя класса из экземпляра класса. Вопрос в другом, можно ли получить имя класса из параметра экземпляра класса (см. первый спойлер)?

Штаааа.
Параметр, если говорить строго, бывает у функций и методов. Что называете параметром вы? Если атрибут — так вот вам ответ.
Чем не подходит предложеный способ?

196 / 162 / 41
Регистрация: 13.05.2019
Сообщений: 833

Лучший ответ

Сообщение было отмечено Murderface как решение

Решение

ЦитатаСообщение от Murderface Посмотреть сообщение

можно ли получить имя класса при обращении к параметру экземпляра этого класса
Нельзя. Но и не очень-то понятно, зачем это нужно.
Регистрация: 11.08.2021
Сообщений: 30
Спасибо! Зачем это нужно я написал в первом сообщении.

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Murderface Посмотреть сообщение

можно ли получить имя класса из параметра экземпляра класса
Запомните на будущее — параметр класса это и есть его экземпляр: self.
196 / 162 / 41
Регистрация: 13.05.2019
Сообщений: 833

Garry Galler, Думаю, он имел в виду атрибут. Сам по себе он конечно тоже является экземпляром какого-нибудь класса, но речь не об этом.

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Matrix3007 Посмотреть сообщение

Думаю, он имел в виду атрибут

Да фиг знает, что он имел ввиду. Я так и не понял по его коду, поэтому ответ давал исключительно по заголовку темы и понимая под параметром — self.

Murderface,
SQL-запрос страшно написан. Нужно отделять котлеты от мух.

ЦитатаСообщение от Murderface Посмотреть сообщение

types[str(type(value))]
type(value).__name__ дает тебе нормальное имя класса вместо строковой репрезентации ««.

1 2 3
>>> type(1).__name__ 'int' >>>

Регистрация: 11.08.2021
Сообщений: 30

ЦитатаСообщение от Garry Galler Посмотреть сообщение

type(value).__name__
Спасибо! Возьму на заметку.

ЦитатаСообщение от Garry Galler Посмотреть сообщение

Я так и не понял

Если взять код из моего первого сообщения под вторым спойлером, добавить к нему код из первого спойлера, добавить код

db = Database() db.create(instance.data)

и выполнить, то в базе данных будет создана таблица с именем list. А я хочу, чтобы она имена имя MyClass, как и экземпляр класса instance.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью.

Передача экземпляра класса в параметр
как передать в метод (в качестве параметра) экземпляр класса, и как редактировать свойства этого.

Как получить ссылку на текущий экземпляр класса внутри этого класса?
Как? Чтобы отрабатывал деструктор! и в нем можно было поиметь этот this . Идея в том, что пишу.

Как создать атрибут экземпляра класса в методе экземпляра класса?
Здравствуйте. Подскажите, как в javascript создать новый атрибут экземпляра класса в методе.

Или воспользуйтесь поиском по форуму:

Хитро узнать имя класса и его метода

На выходе, естественно «. here». Внимание вопрос!
Реально ли получить внутри функции log вместо . имя
класса и метода из которгого эта функция вызвана. Да,
функция лог действительно не метод класса, это не
очепятка.

Если это нереально, можно ли сделать подобное если
сделать log методом предка этого класса? Ну вы поняли,
хочется простенький юнит-логгер. Сторонних монстров
пожалуйста не предлагайте.

Спасибо за внимание.

15.11.2011, 17:41
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Вы сказали Спасибо: 4
Поблагодарили 278 раз(а) в 264 сообщениях
Репутация: 52347
А собственные методы класса ClassName и MethodName вас не устроят?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Страдалецъ
Посмотреть профиль
Отправить персональное сообщение для Страдалецъ
Отправить Email для Страдалецъ
Найти все сообщения от Страдалецъ

15.11.2011, 19:12
Регистрация: 12.11.2011
Сообщения: 10
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10

К сожалению не устроят.

Вы предлагаете так: log( format( ‘вызвано из класса %s’, [ self.classname ] ) );

А хочется получить нечто такое вот: Добавить в uses к своему проекту
некий юнит logger с единственной функцией log, и дёргать эту функцию
в разных местах проекта чтобы она регистрировала имя объекта и класса
откуда её дёрнули и писала их в лог. Извращение, я понимаю, но было бы
очень удобно. Можно конечно этой функции передвать имя класса и метод
явно, в параметрах как показано выше, но это очень лишние движения для
такой мелочи как вывести строчку в лог.

Видимо нужно копать в сторону Call Stack но предвижу большие пляски с
бубном которые совсем не радуют ради такой небольшой цели.

Спасибо за ответ, не ожидал такой быстрой реакции )

Последний раз редактировалось front242, 15.11.2011 в 19:18 .

Узнать имя класса во время исполнения программы

У меня есть функция (используется для записи логов), которая вызывается в разных классах. Не хочется каждый раз переписывать код в ней для каждого нового класса(они будут и добавляться и убираться со временем, ну или вообще функция будет использоваться в дальнейшем в других проектах). Мне хотелось бы узнавать имя класса, из которого она вызывается (для задания имени файлу и прочих плюшек) не передавая лишних параметров в функцию. Это можно реализовать? Можно и boost`ом.

Отслеживать
задан 22 апр 2016 в 10:51
761 1 1 золотой знак 7 7 серебряных знаков 19 19 бронзовых знаков
это похоже на то, что Вы хотите stackoverflow.com/questions/1666802/is-there-a-class-macro-in-c
22 апр 2016 в 11:12
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).
23 апр 2016 в 13:16

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Функция typeid(object) возвращает объект типа type_info с информацией о типе объекта, для которого она вызывается (собственно, о классе). У этого объекта( type_info ) есть метод name() , который и возвращает имя класса. Для использования нужно подключить .

Так что в итоге для получения имени класса нужно использовать

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

Отслеживать
ответ дан 22 апр 2016 в 13:53
36 1 1 бронзовый знак

Никто не гарантирует, что name() вернёт «человеческое» имя. Как показывает практика, в некоторых компиляторах, эти имена ничего не могут сказать человеку.

23 апр 2016 в 9:26

Собственные средства c++ не позволяют ничего узнать о контектсте вызова функции.

Стек вызова можно проанализировать с помощью некоторых внешних библиотек / API операционной системы. Например: http://man7.org/linux/man-pages/man3/backtrace.3.html https://msdn.microsoft.com/en-us/library/ms680650%28VS.85%29.aspx . Но для применение этих средств может налагать дополнительные ограничения на собираемый код (сборка с отладочной информацией и т.д.).

Более разумно, ИМХО, передавать контекст вызова явно: это позволит использовать «штатные» средства c++: __FILE__ , __LINE__ , __func__ , . Извлечение контекста можно замаскировать макросом:

 struct Context< const char* file; unsigned line; const char* function; >; // Work around MSVS #ifndef __func__ #define __func__ __FUNCTION__ #endif #define CONTEXT() Context(< __FILE__, __LINE__, __func__>) void foo( int a, int b, Context c ); #define FOO(a, b) foo( a, b, CONTEXT() ) 

Имя класса можно извлечь либо разобрав имя __FUNCTION__ , либо из указателя this :

 typeid(this).name() 

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

С другой стороны для целей разделения логов может быть достаточно __FILE__ .

js получить название класса

Чтобы получить название класса в JavaScript, нужно использовать свойство className элемента или метод classList для доступа к списку классов элемента.

  1. Используя свойство className :
 class="my-class">
const element = document.querySelector('.my-class'); const className = element.className; console.log(className); // выведет "my-class" 
  1. Используя метод classList :
 class="my-class">
const element = document.querySelector('.my-class'); const classList = element.classList; console.log(classList); // выведет объект DOMTokenList console.log(classList[0]); // выведет первый класс элемента, т.е. "my-class" 

Важно учитывать, что если элемент имеет несколько классов, то возвращаемое свойством className значение будет строкой, содержащей все классы через пробел. Если же нужно работать с каждым классом отдельно, то лучше использовать метод classList , который возвращает объект DOMTokenList , содержащий все классы элемента в виде отдельных строк.

  1. Получение списка всех классов элемента:
 class="foo bar">
const element = document.querySelector('div'); const classList = element.classList; console.log(classList); // выведет DOMTokenList ["foo", "bar"] 
  1. Получение первого класса элемента:
 class="foo bar">
const element = document.querySelector('div'); const firstClass = element.classList[0]; console.log(firstClass); // выведет "foo" 

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

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