gpt4 book ai didi

python - 如何为 namedtuple 的子类提供额外的初始化?

转载 作者:IT老高 更新时间:2023-10-28 20:36:48 26 4
gpt4 key购买 nike

假设我有一个像这样的 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 中的子类化和初始化,尤其是元组。这个解决方案有什么陷阱吗?有推荐的方法吗?好吗?提前致谢。

最佳答案

2017 年编辑: turns out namedtuple isn't a great idea . attrs是现代的替代品。

class Edge(EdgeBase):
def __new__(cls, left, right):
self = super(Edge, cls).__new__(cls, left, right)
self._hash = hash(self.left) * hash(self.right)
return self

def __hash__(self):
return self._hash

__new__ 是你想在这里调用的,因为元组是不可变的。不可变对象(immutable对象)在 __new__ 中创建,然后返回给用户,而不是在 __init__ 中填充数据。

cls 必须两次传递给 __new__ 上的 super 调用,因为 __new__ 对于历史/奇怪的原因隐含了一个 staticmethod

关于python - 如何为 namedtuple 的子类提供额外的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com