Контекст: я хотел бы использовать heapq (и что-нибудь еще) для объектов, которые я не создавал, которые сами по себе не имеют оператора __lt__
. Могу я? (без класса-оболочки).
класс:
class Node:
def __init__(self, val):
self.val = val
Теперь во время выполнения в интерпретаторе мне вручается некоторая коллекция объектов. Я хочу перебрать их, добавив метод dunder (в моем случае lt), например:
n = Node(4)
m = Node(5)
def myLT(self, other):
return self.val < other.val
Что я пробовал:
n.__lt__ = types.MethodType(myLT, n)
m.__lt__ = types.MethodType(myLT, m)
также
n.__lt__ = types.MethodType(myLT, n)
m.__lt__ = types.MethodType(myLT, n)
(на случай, если привязка одного и того же функтора улучшит ситуацию)
>>> n < m
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Node' and 'Node'
даже не смотря на:
>>> n.__lt__(m)
True
Я могу использовать класс-оболочку, который в некотором смысле неприятный (дополнительная память и код обхода становятся более уродливыми, но, по крайней мере, не затрагивают исходные объекты):
class NodeWrapper:
def __init__(self, n):
self.node = n
def __lt__(self):
return self.node.val
Мне просто интересно узнать, делаю ли я что-то не так, добавляя метод dunder, или это просто не работает в python 3.x. Я использую 3.6.9, если это имеет значение.
__slots__
. - person juanpa.arrivillaga   schedule 26.12.2020