Как обеспечить дополнительную инициализацию для подкласса namedtuple?

Предположим, у меня есть namedtuple примерно так:

EdgeBase = namedtuple("EdgeBase", "left, right")

Я хочу реализовать для этого собственную хеш-функцию, поэтому я создаю следующий подкласс:

class Edge(EdgeBase):
    def __hash__(self):
        return hash(self.left) * hash(self.right)

Поскольку объект неизменный, я хочу, чтобы хеш-значение вычислялось только однажды, поэтому я делаю это:

class Edge(EdgeBase):
    def __init__(self, left, right):
        self._hash = hash(self.left) * hash(self.right)

    def __hash__(self):
        return self._hash

Кажется, это работает, но я действительно не уверен насчет подклассов и инициализации в Python, особенно с кортежами. Есть ли подводные камни в этом решении? Есть ли рекомендуемый способ, как это сделать? Это нормально? Заранее спасибо.

46
задан Björn Pollex 2 September 2010 в 07:49
поделиться