Python语法不一致?

Chr*_*ngs 7 python

我一直在读Dive到Python中的 python的特殊类方法,似乎有些方法有奇怪或不一致的语法.

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

>>> my_dictionary.items()
[('name', 'Old Gregg'), ('Race', 'Scaly Man-Fish')]
Run Code Online (Sandbox Code Playgroud)

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

>>> len(my_dictionary)
2
Run Code Online (Sandbox Code Playgroud)

我总是假设类似的方法len()实际上并不是你给他们语法调用的任何类的一部分,但在阅读Dive to Python的第5章之后,我发现len()实际上会导致调用字典方法.

my_dictionary.__len__()
Run Code Online (Sandbox Code Playgroud)

那么为什么它和类似的方法被称为典型的类方法呢?

my_dictionary.len()
Run Code Online (Sandbox Code Playgroud)

有没有我不知道的惯例?

gst*_*eff 13

Guido van Rossum 如此解释:

(a)对于某些操作,前缀表示法只比读后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号.比较我们将x*(a + b)等公式重写为x a + x b的简单性,以及使用原始OO表示法做同样事情的笨拙.

(b)当我阅读代码时,len(x)我知道它是在询问某些东西的长度.这告诉我两件事:结果是一个整数,参数是某种容器.相反,当我阅读时x.len(),我必须知道x是某种实现接口的容器,或者是从具有标准的类继承的len().当没有实现映射的类有一个get()或一个keys()方法,或者一个不是文件的东西有一个方法时,见证我们偶尔会遇到的困惑write().