gpt4 book ai didi

python - 有没有办法在启动新对象时返回先前定义的对象?

转载 作者:行者123 更新时间:2023-12-03 14:06:01 24 4
gpt4 key购买 nike

我正在研究一个以 x 和 y 坐标作为输入的网格生成器。启动时,此节点使用 @classmethod 存储(存储是 set ,请参阅 MWE)在此期间提供唯一索引。作为 __init__ 的一部分, 检查是否已经存在具有相同 (x,y) 坐标的节点;如果是这样,则不应创建新节点。
到现在为止还挺好。当(x,y)坐标已分配给一个时,当我想返回先前定义的节点时,就会出现问题。因此,当我使用先前定义的 (x,y) 坐标启动节点时,我希望返回先前定义的节点对象。举个例子:

n1 = Node(x=0, y=0)
n2 = Node(x=0, y=0)
在这个例子中, n1n2应该包含 正好相同的对象,而不是具有相同细节的副本。因此, n1 == n2应该返回 True ,因为对象是相同的。这对于进一步的计算是必要的(为了清楚起见而省略)。
低于我的 MWE Node -类(class):
class Node:

__nodes = set() # Here, Node-objects are stored
__node_idx = None

def __init__(self, x, y):
# This is the check if the (x,y)-coordinates are already assigned to a node.
if (x, y) not in [n.coordinates for n in self.__nodes]:
self.x = x
self.y = y
self.set_idx(self)
self.store_node(self)
# Should here be something like an 'else'-statement?

@classmethod
def set_idx(cls, node):
"""Function to set unique index based on the number of nodes."""
# There is a procedure to determine this index, but that does not matter for the question.
node.__node_idx = idx

@classmethod
def store_node(cls, node):
cls.__nodes.add(node)

@property
def index(self):
return self.__node_idx

@property
def coordinates(self):
return self.x, self.y
声明 self变成这个先前定义的节点不工作;我已经考虑过了。因此作为 else -声明在 __init__ :
    ...
else:
self = [n for n in self.__nodes if n.coordinates == (x, y)][0]
我看过 __hash__ -method,但我不熟悉它,我不知道这是不是我的问题的解决方案所在。
我正在使用 Python 3.7。非常感谢您的帮助;非常感谢!

最佳答案

使用工厂模式怎么样?

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

class NodeFactory:
def __init__(self):
self.nodes = set()

def create_node(self, x, y):
for node in self.nodes:
if node.x == x and node.y == y:
return node
node = Node(x, y)
self.nodes.add(node)
return node

factory = NodeFactory()

n1 = factory.create_node(1, 5)
n2 = factory.create_node(1, 5)
n3 = factory.create_node(2, 1)

print(n1)
print(n2)
print(n3)

输出:
<__main__.Node object at 0x7fa595aa6640>
<__main__.Node object at 0x7fa595aa6640>
<__main__.Node object at 0x7fa595aa6100>
如您所见 n1n2这里是同一个对象,所以:
>>> n1 == n2
True

关于python - 有没有办法在启动新对象时返回先前定义的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66883601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com