Как получить имя экземпляра из класса в цикле for - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть несколько экземпляров из класса, которые я добавляю в список. Я повторяю этот список, проверяя некоторые условия С этими условиями я выбираю определенные объекты из списка и добавляю их в новый список. Поскольку эти объекты происходят из класса, содержимое нового списка является выделением памяти объектов из класса. Я хочу получить оригинальное имя экземпляра.

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

class Node():
    def __init__(self, y, x):
        self.y = y
        self.x = x
    def operation(self):
        return x**2

node1 = Node(2,2)
node2 = Node(3,3)

nodes = [node1, node2]

for node in nodes:
    good_nodes = []
    if ##CONDITIONS##:
        ##select certain nodes##
    else:
        good_nodes.append(##selected_nodes##, for example : node1)

print(good_nodes)

Что возвращается: [<__main__.Node object at 0x7fe608b27668>]

Что я хочу вернуть (список): [node1,node2,etc]

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Лучшей практикой, если вы хотите идентифицировать экземпляры Node по имени позже, является добавление атрибута имени к объекту. Использование имен переменных, как правило, не очень хорошая идея, потому что то, на что они ссылаются, может измениться.

class Node():
    def __init__(self, name, y, x):
        self.name = name
        self.y = y
        self.x = x
    def operation(self):
        return x**2
    def __repr__(self):
        return self.name

node1 = Node('node1', 2, 2)
node2 = Node('node2', 2, 2)

In [0]: print([node1,node2])
Out [0]: 
    [node1, node2]
0 голосов
/ 04 апреля 2019

Похоже, вы хотите получить доступ к именам переменных, ссылающихся на объекты в одной части кода, в совершенно другой части кода.К сожалению, это не так, как работает Python.

Имена node1 и node2 имеют смысл только в этом блоке кода и не могут быть перепроектированы, если у вас есть ссылка на один и тот же объект в другомблок кода.Это может вызвать проблемы, если два блока кода имеют разные имена для одного и того же объекта.Какой из них «настоящий»?Если вы хотите, чтобы у них было каноническое имя, вам нужно дать им одно, как предлагают другие ответы.

Я также хотел бы отметить, что в вашем коде есть ошибка:

...
for node in nodes:
    good_nodes = [] ## BUG HERE ##
    if ##CONDITIONS##:
        ##select certain nodes##
    else:
        good_nodes.append(##selected_nodes##, for example : node1)
...

good_nodes перезаписывается здесь каждый цикл, поэтому вы будете печатать только последний «хороший узел».Вам нужно переместить строку за пределы цикла:

...
nodes = [node1, node2]

good_nodes = [] # Much better!
for node in nodes:
    if ##CONDITIONS##:
        ##select certain nodes##
    else:
        good_nodes.append(##selected_nodes##, for example : node1)

print(good_nodes)
0 голосов
/ 03 апреля 2019

Имена связаны со значениями.Значение не знает имен, которые к нему относятся.Это означает, что вы не можете получить имя переменной из значения.

Если вы хотите распечатать что-то, что идентифицирует узел осмысленным образом, тогда вы можете переопределить __str__().Например:

class Node:
    # existing code
    def __str__(self):
        return '(' + str(self.x) + ', ' + str(self.y) + ')'

Если вы хотите, чтобы у каждого узла было имя, вы должны добавить его самостоятельно:

class Node:
    def __init__(self, y, x, name):
        self.y = y
        self.x = x
        self.name = name

Чтобы распечатать это, вам нужно будет изменить__str__() функция в моем первом примере.

...