Python: как обращаться к имени экземпляра?

Я собираю экземпляры, используя следующий код:

class Hand(): instances = [] def __init__(self): Hand.instances.append(self) self.value = 5 def do_something(self, a): self.value = self.value * a class Foo(): def __init__(self): pass def insty(self): self.hand1 = Hand() self.hand2 = Hand() foo = Foo() foo.insty() print Hand.instances for hand in Hand.instances: print "how do I print the instance name?" 

Последняя строка – это просто способ узнать, как получить доступ к имени экземпляра, чтобы я мог вызвать метод do_something на каждом экземпляре по порядку.

Как получить доступ к имени экземпляра для каждого экземпляра Hand?

4 Solutions collect form web for “Python: как обращаться к имени экземпляра?”

Если вы имеете в виду, как получить hand1 из экземпляра, который вы назначили self.hand1 , ответ заключается в том, что вы не можете. Когда вы делаете self.hand1 = Hand() , вы self.hand1 = Hand() объекту Foo, что у него есть Рука, но объект Hand не знает, что он был назначен Foo. Вы можете сделать это:

 h = Hand() self.bob = h self.larry = h 

Итак, что такое «имя» этой Руки? Вы назначили одну и ту же руку как «bob», так и «larry», поэтому нет никакого уникального имени.

Если вы хотите иметь имя для каждой руки, вам нужно указать рукой, какое имя вы хотите дать. Вам нужно будет изменить свой код руки, чтобы вы могли передать имя конструктору, а затем создать Hand with Hand("some name") .

Конечно, вы можете присвоить им «имена», назначив им атрибуты:

 self.hand1 = Hand() self.hand1.name = "hand 1" 

, , , но эти имена не являются особыми или «автоматическими».

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

Я не знаю, решит ли это вашу проблему или нет. Мне нужно было получить имена экземпляров, чтобы сделать отчет об ошибках. Повсюду я смотрел, люди говорили, что «переменные не имеют имен! Это просто указатель на эту вещь!»

Но оказывается, что получение имен экземпляров в python довольно просто. Вот как я это сделал:

 import gc def instance_names(self): referrers = gc.get_referrers(self) result = [] dict_of_things = {} for item in referrers: if isinstance(item, dict): dict_of_things = item for k, v in dict_of_things.items(): if v == self: result.append(k) if not result: result = ['unnamed instance'] return result 

foo = Foo() означает, что переменная foo просто указывает на объект, возвращаемый Foo() , здесь нет понятия имени.

foo.__dict__ будет иметь hand1 « hand1 » и « hand2 » (среди прочих). Но вы, вероятно, ошибетесь. Если имена значительны, вы должны использовать их как явные индексы в Foo (или где-нибудь).

например

 class Foo(): def __init__(self): self.hands = {} def insty(self): self.hands['hand1'] = Hand() self.hands['hand2'] = Hand() 
  • как убить витые экземпляры протокола python
  • Python: Как передать переменные между экземплярами класса или получить вызывающего?
  • python: доступ к переменной экземпляра с использованием имени, содержащего переменную
  • Python создает несколько экземпляров для одного объекта / класса
  • Как избежать нескольких экземпляров программы?
  • Как вы смешиваете классы Python старого стиля и нового стиля?
  • Когда использовать Singleton в python?
  • В Python, как проверить, существует ли экземпляр моего класса?
  •  
    Interesting Posts for Van-Lav

    Заменить HTML-ссылки на текст

    UnBoundLocalError: Локальная переменная, на которую ссылаются перед назначением

    Что означает статус выхода 3 процесса?

    как нормализовать массив numpy?

    Разница между картой и диктоном

    создание сервера django, доступного в локальной сети

    Как правильно вставлять временные метки NULL в postgres с помощью панд

    Что делать, если / я должен использовать потоки для обновления глобальных переменных.

    Задержка браузера с изменением содержимого страницы в django admin (кеширование, python / django)

    Ошибка Django: отношения "users_user" не существует

    Numpy: поиск разницы между двумя файлами, содержащими значения float

    Почему python docstring интерпретируется иначе, чем комментарий

    Возможно, SQLAlchemy может совместно использовать базу данных SQLite из нескольких процессов Python?

    OpenCV возвращает координаты ключевых точек и область из обнаружения blob, Python

    Несколько файлов И выбор папок в QFileDialog?

    Python - лучший язык программирования в мире.