Python语法不一致?

Python语法不一致?,python,Python,我一直在阅读python的in,似乎有些方法有奇怪或不一致的语法 要从字典中获取项,可以调用字典类方法items() 但是,要确定该字典中的键数,可以调用len(),并将其与字典一起作为参数提供 >>> len(my_dictionary) 2 我一直认为像len()这样的方法实际上并不是在给定语法的情况下调用它们的任何类的一部分,但在阅读了《深入Python》第5章之后,我发现len()实际上会导致调用字典方法 my_dictionary.__len__() 那么为什么它

我一直在阅读python的in,似乎有些方法有奇怪或不一致的语法

要从字典中获取项,可以调用字典类方法items()

但是,要确定该字典中的键数,可以调用
len()
,并将其与字典一起作为参数提供

>>> len(my_dictionary)
2
我一直认为像
len()
这样的方法实际上并不是在给定语法的情况下调用它们的任何类的一部分,但在阅读了《深入Python》第5章之后,我发现
len()
实际上会导致调用字典方法

my_dictionary.__len__()
那么为什么它和类似它的方法调用起来不像一个典型的类方法呢

my_dictionary.len()
有没有我不知道的惯例

Guido van Rossum:

(a) 对于某些运算来说,前缀表示法的可读性比后缀表示法要好——前缀(和中缀!)运算在数学中有着悠久的传统,它喜欢在视觉上帮助数学家思考问题的表示法。将我们将x*(a+b)这样的公式改写为xa+xb的简单方法与使用原始OO表示法做同样事情的笨拙方法进行比较


(b) 当我读到写着len(x)的代码时,我知道它要求的是某物的长度。这告诉我两件事:结果是一个整数,参数是某种容器。相反,当我阅读
x.len()
时,我必须知道x是一种容器,它实现了一个接口或继承了一个具有标准
len()
的类。当一个没有实现映射的类有一个
get()
keys()
方法,或者一个不是文件的类有一个
write()
方法时,我们有时会感到困惑

Python中有很多方法,如果它们实现了相关的API,就可以应用于对象

len() --> __len__()
str() --> __str__()
repr() --> __repr__()
除此之外:

为什么要

my_dictionary.len()
这是一种方法吗

在Javascript中,对象通过“length”属性公开其大小,该属性更为重要
比使用方法更自然……抱歉,但并非所有来自Java世界的废话都是好的,而且必须在其他语言中可用。

这种区别很有用,因为它将使用与源代码分开。当对dictionary类的扩展进行编码时,您知道您正在重写作为语言的一部分内置到基对象中的某些内容。如果确实要更改容器的行为方式,请覆盖
\uuuu len\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

然而,作为某人代码的用户,我不必担心这一点。如果我使用
len(my_dictionary)
,我希望程序员知道实现
\uuu len()
的正确方法,从而获得一致的行为。而任何人都可以编写一个随机的my_dictionary.len()方法。我不知道


参考了解更多关于下划线方法的参考信息,这些方法大多与您的实际问题相切(参见第2.7.1节了解
\uu len\uu()
)。

我认为
abs()
也属于这一类。在该链接中/F自己的解释的后一部分也很有见地。根据类可能提供的其他接口,许多内置函数都有默认实现。因此,例如,
iter(x)
,首先尝试
x.\uu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux()
x.\uuuuuuuuuuuuuuuuuuuuuuuuu。
my_dictionary.len()