2024-04-19 11:43:00 发布
网友
正如标题所要求的。Python有很多特殊的方法,__add__,__len__,__contains__等c。为什么在执行max时没有调用__max__方法?示例代码:
__add__
__len__
__contains__
__max__
class A: def __max__(): return 5 a = A() max(a)
似乎range()和其他结构可以从中受益。我错过了其他有效的方法吗?¨
range()
附录1: 作为一个简单的例子,max(range(1000000000))需要很长时间才能运行。你知道吗
max(range(1000000000))
我没有权威的答案,但我可以提出我对这个问题的看法。你知道吗
有几个内置函数没有相应的特殊方法。例如:
max
min
sum
all
any
它们有一个共同点,就是它们是reduce-like:它们迭代一个iterable,并将其“reduce”为一个值。这里的重点是,这些更像是一个积木。你知道吗
例如,在应用iterable之前,通常将其包装到生成器(或其他理解,或转换,如map或filter)中:
map
filter
sum(abs(val) for val in iterable) # sum of absolutes any(val > 10 for val in iterable) # is one value over 10 max(person.age for person in iterable) # the oldest person
这意味着大多数时候它甚至不会调用iterable的__max__,而是尝试在生成器上访问它(生成器没有实现,也无法实现)。你知道吗
因此,如果这些措施得以实施,就没有什么好处了。在少数有意义的情况下,如果您创建一个自定义方法(或属性),会更加明显,因为它会突出显示它是一个“快捷方式”,或者它与“正常结果”不同。你知道吗
例如,这些函数(min等)有O(n)运行时,因此如果您可以做得更好(例如,如果您有一个排序列表,您可以访问O(1)中的max),那么显式地记录它可能是有意义的。你知道吗
O(n)
O(1)
有些操作不是基本操作。以max为例,它实际上是一个基于比较的操作。换句话说,当你得到一个max值时,你实际上得到了一个最大的值。你知道吗
那么在这种情况下,为什么我们要实现一个指定的max函数,而不是重写比较的行为呢?你知道吗
换个角度想想,max到底是什么意思?例如,当我们执行max(list)时,我们在做什么?你知道吗
max(list)
我认为我们实际上是在检查list的元素,而max操作与list本身根本没有关系。你知道吗
list
list只是max操作中不需要的容器。它是list或者set或者别的什么,都不重要。真正有用的是这个容器中的元素。你知道吗
set
因此,如果我们为list定义一个__max__操作,我们实际上在执行另一个完全不同的操作。我们要求一个集装箱给我们关于最大价值的建议。你知道吗
我认为在这种情况下,因为它是一个完全不同的操作,所以它应该是一个容器的方法,而不是重写内置函数的行为。你知道吗
我没有权威的答案,但我可以提出我对这个问题的看法。你知道吗
有几个内置函数没有相应的特殊方法。例如:
max
min
sum
all
any
它们有一个共同点,就是它们是reduce-like:它们迭代一个iterable,并将其“reduce”为一个值。这里的重点是,这些更像是一个积木。你知道吗
例如,在应用iterable之前,通常将其包装到生成器(或其他理解,或转换,如
map
或filter
)中:这意味着大多数时候它甚至不会调用iterable的
__max__
,而是尝试在生成器上访问它(生成器没有实现,也无法实现)。你知道吗因此,如果这些措施得以实施,就没有什么好处了。在少数有意义的情况下,如果您创建一个自定义方法(或属性),会更加明显,因为它会突出显示它是一个“快捷方式”,或者它与“正常结果”不同。你知道吗
例如,这些函数(
min
等)有O(n)
运行时,因此如果您可以做得更好(例如,如果您有一个排序列表,您可以访问O(1)
中的max
),那么显式地记录它可能是有意义的。你知道吗有些操作不是基本操作。以
max
为例,它实际上是一个基于比较的操作。换句话说,当你得到一个max值时,你实际上得到了一个最大的值。你知道吗那么在这种情况下,为什么我们要实现一个指定的
max
函数,而不是重写比较的行为呢?你知道吗换个角度想想,
max
到底是什么意思?例如,当我们执行max(list)
时,我们在做什么?你知道吗我认为我们实际上是在检查
list
的元素,而max
操作与list
本身根本没有关系。你知道吗list
只是max
操作中不需要的容器。它是list
或者set
或者别的什么,都不重要。真正有用的是这个容器中的元素。你知道吗因此,如果我们为
list
定义一个__max__
操作,我们实际上在执行另一个完全不同的操作。我们要求一个集装箱给我们关于最大价值的建议。你知道吗我认为在这种情况下,因为它是一个完全不同的操作,所以它应该是一个容器的方法,而不是重写内置函数的行为。你知道吗
相关问题 更多 >
编程相关推荐