繁体   English   中英

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

[英]How to get name of instance from class in for loop

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

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

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]

名称与值相关联。 值不知道引用它的名称。 这意味着您无法从值中获取变量名称。

如果要打印出有意义的方式来标识节点,则可以覆盖__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__()函数。

如果要稍后通过名称标识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]

您似乎想要访问在代码的一部分,在代码的完全不同的部分中引用对象的变量的名称。 不幸的是,这不是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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM