如何从for循环中获取类的实例名称

问题描述 投票:2回答:3

我有一个类添加到列表中的多个实例。我遍历该列表检查一些条件。在这些条件下,我从列表中选择某些对象并将它们添加到新列表中。因为这些对象来自类,所以新列表的内容是来自类的对象的内存分配。我希望得到实例的原始名​​称。

老实说,我不知道为什么会这样,我没有找到解决这个问题的答案,也许我在某个地方犯了错误,或者我只是不知道。请发布答案

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]

python oop for-loop instance
3个回答
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__()函数。


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]

-1
投票

您似乎想要在代码的一部分中访问引用对象的变量的名称,在代码的完全不同的部分。不幸的是,这不是Python的工作方式。

名称node1node2仅在该代码块中有意义,如果您在不同的代码块中引用相同的对象,则无法进行逆向工程。如果两个代码块对同一个对象具有不同的名称,那么这将导致问题。哪一个是“真正的”?如果你希望他们有一个规范的名字,你必须给他们一个,就像其他答案所暗示的那样。

我还想指出你的代码中有一个错误:

...
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)
© www.soinside.com 2019 - 2024. All rights reserved.