Pythonic方式描述“魔法物品”(在“魔法数字”意义上)

时间:2016-04-09 09:52:51

标签: python python-3.x

我有类Node的对象,它们通过id进行比较。现在我还有一些具有特殊含义的节点,SpecialNodeASpecialNodeB。它们没有任何属性,只是通过成为那种类型/那个对象来传达它们的特殊含义。它将它们称为“魔术物体”,因为它们具有类似“神奇数字”的功能。

正如在下面的评论中所说:我正在寻找像单身人士一样的东西。它将与其他类型进行比较,不应该抛出异常,只需给出错误。

我目前按以下方式进行:

class Node:
  def __eq_(self, other)
    return (self.id == other.id)

class SpecialNodeA:
  pass;

class SpecialNodeB:
  pass;

spNoA = SpecialNodeA() # 
spNoB = SpecialNodeB()

n1 = Node(id = 1)
specialNodeA1 = spNoA
specialNodeA2 = spNoA
specialNodeB1 = spNoB
specialNodeB2 = spNoB

print(n1 == specialNode1) # should return false
print(specialNodeA1 == specialNodeA2) # should return true
print(specialNodeA1 == specialNodeB2) # should return false

它运作正常,但是有一种“更加pythonic”的方式来实现这样的“魔术对象”吗?

1 个答案:

答案 0 :(得分:0)

我可能会使用enum

from enum import Enum
class SpecialNodes(Enum):
    A = 1
    B = 2

或者如果你想要实际的节点:

class SpecialNodes(Enum):
    A = Node()
    B = Node()

样品:

>>> class Node:
...     pass
... 
>>> class SpecialNodes(Enum):
...     B=Node()
...     A=Node()
... 
>>> A1 = SpecialNodes.A
>>> A2 = SpecialNodes.A
>>> B1 = SpecialNodes.B
>>> A1 == A2
True
>>> A1 == B1
False