2016-04-09 2 views
0

У меня есть объекты класса Node, они сравниваются с идентификатором. Теперь у меня также есть узлы со специальным значением, SpecialNodeA и SpecialNodeB. У них нет никаких свойств, они просто переносят свое особое значение, будучи тем типом/этим объектом. Это назовёт их «магическими объектами», поскольку они имеют аналогичную функцию «магические числа».Pythonic способ описать «магические объекты» (в смысле «магических чисел»)

Как было сказано в комментарии ниже: Я ищу что-то вроде синглтона, которое только равно себе. Он будет сравниваться с другими типами и не должен генерировать исключение, просто дайте false.

я в настоящее время сделать это следующим образом:

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 

Он отлично работает, но есть «более вещий» способ реализации таких «волшебных предметов»?

+0

Неясно, что вы просите. Пахнет, если вы хотите, чтобы «SpecialNodeA» и «SpecialNodeB» были одиночными, равными только самим себе, и несколькими экземплярами «Node» (с разными идентификаторами), но я не уверен. Возможно, это проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+0

Я добавил это в вопрос, но я думаю, что это должно быть довольно ясно, учитывая пример кода. – Michael

ответ

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