Python语法不一致?

时间:2011-05-05 04:38:37

标签: python

我一直在special class methods阅读python的Dive into Python,似乎有些方法的语法奇怪或不一致。

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

>>> my_dictionary.items()
[('name', 'Old Gregg'), ('Race', 'Scaly Man-Fish')]

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

>>> len(my_dictionary)
2

我总是认为像len()这样的方法实际上并不是你给他们语法调用的任何类的一部分,但是在阅读Dive to Python的第5章之后,我发现len()确实导致了被称为字典方法。

my_dictionary.__len__()

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

my_dictionary.len()

有没有我不知道的惯例?

3 个答案:

答案 0 :(得分:12)

Guido van Rossum explained it thusly

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

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

答案 1 :(得分:1)

这种区别很有用,因为它将使用与来源分开。在对字典类进行编码扩展时,您知道要覆盖作为语言一部分构建到基础对象中的内容。如果您真的想要更改容器的行为方式,则会覆盖__len__(), __getitem__()等等。

但是,作为某人代码的用户,我不必担心。如果我使用len(my_dictionary),我希望基于程序员知道实现__len__()的正确方法的一致行为。而任何人都可以编写一个随机的my_dictionary.len()方法。不知道那个。

参考http://www.siafoo.net/article/57以获取有关下划线方法的更多参考信息,这些信息与您的实际问题大致相同(__len__()的第2.7.1节)。

答案 2 :(得分:0)

我们不在Java世界。

如果Python实现了相关的API

,那么Python中有很多方法适用于对象
len() --> __len__()
str() --> __str__()
repr() --> __repr__()

除此之外:

为什么要

my_dictionary.len()

是一种方法吗?

在Javascript对象中,通过'length'属性公开它们的大小 自然而不是使用方法....对不起,但并非所有来自Java世界的废话都是好的,必须以其他语言提供。