Получить имя класса через параметр экземпляра этого класса
Добрый день! Подскажите пожалуйста можно ли получить имя класса при обращении к параметру экземпляра этого класса?
Кликните здесь для просмотра всего текста
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, и передать в конструктор его родительского класса параметр.
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
Вы получаете имя класса из экземпляра класса. Вопрос в другом, можно ли получить имя класса из параметра экземпляра класса (см. первый спойлер)?
4615 / 2036 / 359
Регистрация: 17.03.2012
Сообщений: 10,103
Записей в блоге: 6
Сообщение от Murderface
имя класса из экземпляра класса. Вопрос в другом, можно ли получить имя класса из параметра экземпляра класса (см. первый спойлер)?
Штаааа.
Параметр, если говорить строго, бывает у функций и методов. Что называете параметром вы? Если атрибут — так вот вам ответ.
Чем не подходит предложеный способ?
196 / 162 / 41
Регистрация: 13.05.2019
Сообщений: 833
Сообщение было отмечено Murderface как решение
Решение
Сообщение от Murderface
можно ли получить имя класса при обращении к параметру экземпляра этого класса
Нельзя. Но и не очень-то понятно, зачем это нужно.
Регистрация: 11.08.2021
Сообщений: 30
Спасибо! Зачем это нужно я написал в первом сообщении.
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
Сообщение от Murderface
можно ли получить имя класса из параметра экземпляра класса
Запомните на будущее — параметр класса это и есть его экземпляр: self.
196 / 162 / 41
Регистрация: 13.05.2019
Сообщений: 833
Garry Galler, Думаю, он имел в виду атрибут. Сам по себе он конечно тоже является экземпляром какого-нибудь класса, но речь не об этом.
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 для доступа к списку классов элемента.
- Используя свойство className :
class="my-class">