[python] имя экземпляра класса
От: sergesokolov Россия http://www.ideashag.spb.ru
Дата: 04.10.09 15:55
Оценка:
Привет всем кого подвигло работать в выходной
У меня тут система которая генерирует до черта экземпляров одного класса (пока десятки, но возможно и на порядки больше) они затем выстраиваются в иерархию, а для этого должны обмениваться сообщениями. Для этого каждый должен знать свое имя, которое вырабатывается автоматически – " тфьу… то есть конечно “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']"


короче, проще и надежнее передавать экземпляру какой-нибудь идшник явным образом

[Интервью] .NET Security — это просто
Автор: 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).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.