作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一个以 x 和 y 坐标作为输入的网格生成器。启动时,此节点使用 @classmethod
存储(存储是 set
,请参阅 MWE)在此期间提供唯一索引。作为 __init__
的一部分, 检查是否已经存在具有相同 (x,y) 坐标的节点;如果是这样,则不应创建新节点。
到现在为止还挺好。当(x,y)坐标已分配给一个时,当我想返回先前定义的节点时,就会出现问题。因此,当我使用先前定义的 (x,y) 坐标启动节点时,我希望返回先前定义的节点对象。举个例子:
n1 = Node(x=0, y=0)
n2 = Node(x=0, y=0)
在这个例子中,
n1
和
n2
应该包含
正好相同的对象,而不是具有相同细节的副本。因此,
n1 == n2
应该返回
True
,因为对象是相同的。这对于进一步的计算是必要的(为了清楚起见而省略)。
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,但我不熟悉它,我不知道这是不是我的问题的解决方案所在。
最佳答案
使用工厂模式怎么样?
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>
如您所见
n1
和
n2
这里是同一个对象,所以:
>>> n1 == n2
True
关于python - 有没有办法在启动新对象时返回先前定义的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66883601/
我是一名优秀的程序员,十分优秀!