我一直在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()
有没有我不知道的惯例?
答案 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世界的废话都是好的,必须以其他语言提供。