gpt4 book ai didi

python - 如何实现类的内置sum()?

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:59 25 4
gpt4 key购买 nike

应用于字典的内置函数 sum() 返回其键的总和:

>>> sum({1: 0, 2: 10})
3

我想创建一个字典的子类,比如 SubDict,并覆盖一些函数以返回其值的总和,即

>>> sum(SubDict((1, 0), (2, 10))
10

我需要覆盖哪个函数才能实现此功能?

这是一个一般性问题,如何将内置的 sum() 函数实现到一个类,而不仅仅是在这种特殊情况下。

最佳答案

sum 的有效实现如下:

def sum(sequence, start=0):
for value in sequence:
start = start + value
return start

因此,您不能直接覆盖 sum ……但是如果您可以覆盖 for value in ...... 对序列的处理方式*或 + 对您的值起作用,这将自动影响 sum。当然,任何一个都会有副作用——您将影响序列的任何迭代,或者任何值的添加,而不仅仅是 sum 中的值

要覆盖迭代,您需要提供一个返回适当迭代器的 __iter__ 方法。要覆盖添加,您需要提供一个 __add__ 方法。


但实际上,您为什么要尝试“覆盖总和”?为什么不写一个新函数来做你想做的事呢?您可以添加对您的类型进行特殊处理的代码,然后回退到内置的 sum 否则。如果你想让它更“开放”,你可以使用PEP 443 single-dispatch 使注册新类型成为特殊情况变得容易。我认为这就是您真正想要的。


* 正如 agf 在评论中指出的那样,尽管参数被称为 sequence,但它实际上接受任何可迭代对象。这是一件好事,因为字典不是序列……

关于python - 如何实现类的内置sum()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136507/

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