Załóżmy, że mam namedtuple
takiego:Jak zapewnić dodatkową inicjalizację dla podklasy namedtuple?
EdgeBase = namedtuple("EdgeBase", "left, right")
Chcę zaimplementować niestandardową hash-funkcja dla tego, więc tworzę następujące podklasy:
class Edge(EdgeBase):
def __hash__(self):
return hash(self.left) * hash(self.right)
Ponieważ obiekt jest niezmienny, ja chcą hash-wartość oblicza się tylko raz, więc mogę to zrobić:
class Edge(EdgeBase):
def __init__(self, left, right):
self._hash = hash(self.left) * hash(self.right)
def __hash__(self):
return self._hash
to wydaje się działać, ale nie jestem pewien, o s ubclassing i inicjalizacja w Pythonie, szczególnie z krotkami. Czy są jakieś pułapki na to rozwiązanie? Czy istnieje zalecany sposób, aby to zrobić? Czy to w porządku? Z góry dziękuję.
Testy wykazały, że nie warto buforować wartości hash, zobacz [issue # 9685] (https://mail.python.org/pipermail/python-bugs-list/2013- January/192363.html) –