Как узнать имя класса python
Привет всем кого подвигло работать в выходной
У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
Re: [python] имя экземпляра класса
| От: | neFormal |
| Дата: | 04.10.09 16:03 |
| Оценка: |
Здравствуйте, sergesokolov, Вы писали:
S>Привет всем кого подвигло работать в выходной
S>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
S>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
глобальная переменная?. параметр в конструктор?. почему не?.
. coding for chaos.
Re[2]: [python] имя экземпляра класса
| От: | sergesokolov | http://www.ideashag.spb.ru |
| Дата: | 04.10.09 16:12 | |
| Оценка: |
Здравствуйте, neFormal, Вы писали:
F>Здравствуйте, sergesokolov, Вы писали:
S>>Привет всем кого подвигло работать в выходной
S>>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
S>>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
F>глобальная переменная?. параметр в конструктор?. почему не?.
Как говорил вини — пух и то и другое, но скромность заставляет пока параметр в собственный конструктор.
Re[3]: [python] имя экземпляра класса
| От: | neFormal |
| Дата: | 04.10.09 16:54 |
| Оценка: |
Здравствуйте, sergesokolov, Вы писали:
S>>>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
S>>>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
F>>глобальная переменная?. параметр в конструктор?. почему не?.
S>Как говорил вини — пух и то и другое, но скромность заставляет пока параметр в собственный конструктор.
а в чём суть вопроса?.
типа «какие ещё есть варианты» ?.
. coding for chaos.
Re: [python] имя экземпляра класса
| От: | netch80 | http://netch80.dreamwidth.org/ |
| Дата: | 04.10.09 16:58 | |
| Оценка: | +1 | |
Здравствуйте, sergesokolov, Вы писали:
S>Привет всем кого подвигло работать в выходной 🙂
S>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
А откуда взялось i?
И что такое «имя» в данном случае?
S>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ 🙂 self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
Что-то тут сильно напутано. Требуется уникальное «имя»? Встречный вопрос — насколько оно уникально? В частности, допускается ли существование одноимённых экземпляров в _разное_ время (первый завершился, затем второй начался)? Если допускается — в качестве имени достаточно использовать id(self), или прибавить его к чему-то. Если второе — нужен последовательный номер, увеличивающийся при работе приложения с каждым экземпляром.
То есть, первый подход даст код вроде следующего:
class Foo: myname = None def __init__(self): self.myname = self.__class__.__name__ + str(id(self))
foo_seq = 0 class Foo: myname = None def __init__(self): global foo_seq foo_seq += 1 self.myname = self.__class__.__name__ + str(foo_seq)
Если требуется уникальность между разными процессами, локальное число заменяется на UUID (он же Гога, он же Гоша, он же GUID).
The God is real, unless declared integer.
Re[4]: [python] имя экземпляра класса
| От: | sergesokolov | http://www.ideashag.spb.ru |
| Дата: | 04.10.09 17:01 | |
| Оценка: |
Здравствуйте, neFormal, Вы писали:
F>Здравствуйте, sergesokolov, Вы писали:
S>>>>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
S>>>>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
F>>>глобальная переменная?. параметр в конструктор?. почему не?.
S>>Как говорил вини — пух и то и другое, но скромность заставляет пока параметр в собственный конструктор.
F>а в чём суть вопроса?.
F>типа «какие ещё есть варианты» ?.
экземпляру надо знать как он называется в формате string, что бы отправлять эти данные. Там связь с снсорнной матрицей, и обмениваясь с ней данными эксемпляр образует свой статус.
Re: [python] имя экземпляра класса
| От: | kochetkov.vladimir | https://kochetkov.github.io |
| Дата: | 04.10.09 17:24 | |
| Оценка: |
Здравствуйте, sergesokolov, Вы писали:
S>Привет всем кого подвигло работать в выходной
S>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
S>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
на момент выполнения __init__, создаваемый экземпляр еще не «привязан» к какому либо имени, поэтому «узнать свое имя из __init__» вряд ли удасться, AFAIK. Но если очень хочется, то можно выдрать нужную инфу из GC в любом другом методе класса (держа в уме, что у объекта может быть и несколько «имен», причем в разных областях видимости, т.е. возможно и недоступных на момент вызова этого метода):
import sys, gc class TestClass1: def getNames(self): frame = sys._getframe() for frame in iter(lambda: frame.f_back, None): frame.f_locals result = [] for referrer in gc.get_referrers(self): if isinstance(referrer, dict): for k, v in referrer.iteritems(): if v is self: result.append(k) return result def __init__(self): print self.getNames() #не фига не выведет (точнее выведет "['self']", т.к. другие идентификаторы, ссылающиеся на текущий экземпляр, в этот момент отсутствуют) testInstance1 = TestClass1() testInstance3 = testInstance1 testInstance2 = TestClass1() print testInstance1.getNames() #выведет "['testInstance3', 'testInstance1']" print testInstance2.getNames() #выведет "['testInstance2']"
короче, проще и надежнее передавать экземпляру какой-нибудь идшник явным образом
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: [python] имя экземпляра класса
| От: | sergesokolov | http://www.ideashag.spb.ru |
| Дата: | 04.10.09 17:55 | |
| Оценка: |
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, sergesokolov, Вы писали:
S>>Привет всем кого подвигло работать в выходной
S>>У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – » тфьу… то есть конечно “name” + str(i)
N>А откуда взялось i?
for i in range(0, количество экземпляров)
N>И что такое «имя» в данном случае?
я же не могу образовывать имя из одного числа.
S>>В принципе я могу сгенерировать засылку в экземпляр его идентификатора, таким же способом, но хочется что бы он изнутри узнавал свое имя из __init__ self.__class___.__name___ выдает название самого класса, а не текущего экземпляра. Поиск простым перебором по разным __getattr__ угробил выходной.
N>Что-то тут сильно напутано. Требуется уникальное «имя»? Встречный вопрос — насколько оно уникально? В частности, допускается ли существование одноимённых экземпляров в _разное_ время (первый завершился, затем второй начался)? Если допускается — в качестве имени достаточно использовать id(self), или прибавить его к чему-то. Если второе — нужен последовательный номер, увеличивающийся при работе приложения с каждым экземпляром.
Имя уникально потому, что образуется из каких-то первых букв названия и порядкового номера. Завершения одного с началом работы другого пожалуй не нужно, но будет частичная блокировка. Доминорование одних над другими в случе удачи первых и неудач вторых — это и строит иерархию.
N>То есть, первый подход даст код вроде следующего:
N>
N>class Foo: N> myname = None N> def __init__(self): N> self.myname = self.__class__.__name__ + str(id(self)) N>
N>второй — такое:
N>
N>foo_seq = 0 N>class Foo: N> myname = None N> def __init__(self): N> global foo_seq N> foo_seq += 1 N> self.myname = self.__class__.__name__ + str(foo_seq) N>
Ну примерно как и я пробовал.
N>Если требуется уникальность между разными процессами, локальное число заменяется на UUID (он же Гога, он же Гоша, он же GUID).
Как вывести имя экземпляра класса?
Чтобы вернуть имя переменной, можно поискать наш объект в globals().
class Foo: def get_var_name(self): for k, v in globals().items(): if v is self: return k def __str__(self): return f'>' foo = Foo() print(foo) #
Ссылку на один объект можно хранить в нескольких переменных, поэтому можно искать все совпадения:
class Foo: def get_var_names(self): return [k for k, v in globals().items() if v is self] def __str__(self): return f'>' foo = Foo() bar = foo abc = bar print(foo) #
Минус алгоритма — он работает только с глобальными переменными, поэтому локальные переменные не будут видны:
def go(): foo = Foo() bar = foo abc = bar print(foo) go() #
Получить имя класса через параметр экземпляра этого класса
Добрый день! Подскажите пожалуйста можно ли получить имя класса при обращении к параметру экземпляра этого класса?
Кликните здесь для просмотра всего текста
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()
Классы¶
Класс — шаблон, с помощью которого удобно описывать однотипные объекты. В классе соержатся свойства, правила создания и поведение объекта.
- Объект — экземпляр, созданный на основе шаблона.
- Атрибут — поле, хранящее значение. Содержит свойства объекта.
- Метод — функция, связанная с классом. Описывает поведение или действия объекта.
Пример класса — автомобили, его атрибутами будут: цвет, марка автомобиля, регистрационный номер.
Методами могут быть: ехать прямо, повернуть, остановиться.
Объектом класса “Автомобили” может быть конкретный автомобиль, например, Renault Logan белого цвета с номером М123РТ.
Для чего нужны классы?
Классы помогают кратко и понятно описывать объекты и их поведение независимо от основного кода программы.
Затем в основном коде можно просто создавать объекты на основе классов и работать с ними, уже не описывая их свойств и поведения.
Такой подход делает код более читаемым и понятным, а также помогает избежать многих ошибок и багов.
Синтаксис и правила создания классов¶
Для создания класса используется конструкция class ClassName . Согласно договорённостям имя класса всегда пишется с большой буквы.
Каждый класс должен содержать метод __init__ — с помощью этого метода создаётся объект класса. В этом методе инициализируются атрибуты класса:
class Person: # Объявления класса def __init__(self, name, age): # Метод инициализации self.age = age # Установка значений атрибутов self.name = name
Также в классах могут быть использованы встроенные методы, их называют магическими. Магические методы — зарезервированные методы, отвечающие за поведение объекта.
