我有一个添加到列表的类的多个实例。我遍历该列表,检查一些条件。在这些条件下,我从列表中选择某些对象并将其添加到新列表中。因为这些对象来自类,所以新列表的内容是该类中对象的内存分配。我希望获得实例的原始名称。
老实说,我不知道为什么会这样,我还没有找到解决问题的答案,也许是我在某个地方犯了错误,或者我只是不知道。请发布答案
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]
答案 0 :(得分:0)
名称与值关联。值不知道引用它的名称。这意味着您无法从值中获取变量名称。
如果要打印出有意义的方式来标识节点,则可以覆盖__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__()
函数。
答案 1 :(得分:0)
如果要稍后通过名称标识Node的实例的最佳实践是将name属性添加到对象。使用变量名通常不是一个好主意,因为它们所指的内容可能会更改。
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]
答案 2 :(得分:-1)
您似乎想要访问在代码的一部分(完全不同的一部分)中引用对象的变量的名称。不幸的是,这不是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)