在全局范围内提供某些默认方法(如len函数)的原因是什么,而不是在实例级别提供它们,例如:
list.len()
而不是:
len (list)
我发现像len这样的方法比实例方法更难发现。
这背后有什么理由吗?
答案 0 :(得分:6)
这个问题与this one非常相似。答案是一样的:
因为Python的创建者Guido van Rossum认为前缀表示法在某些情况下更具可读性。 Here是完整的答案。我要引用一些部分:
(a)对于某些操作,前缀表示法只读取比 postfix - prefix(和infix!)操作有着悠久的传统 数学,喜欢视觉效果帮助的符号 数学家思考问题。比较我们的简单方法 将x *(a + b)之类的公式重写为x a + x b的笨拙 使用原始OO表示法做同样的事情。
(b)当我读到代表len(x)的代码时,我知道它要求的 某事的长度。这告诉我两件事:结果是 整数,参数是某种容器。与此相反的, 当我读x.len()时,我必须知道x是某种形式 容器实现接口或从类继承 有一个标准的len()。见证我们偶尔会遇到的困惑 没有实现映射的类有get()或keys() 方法,或非文件的东西都有write()方法。
以另一种方式说同样的事情,我认为'len'是内置的 操作。我不想失去那个。我不能肯定地说你是否 意味着与否,但'def len(self):......'肯定听起来像你 想把它降级为普通的方法。我非常喜欢这个。
答案 1 :(得分:4)
This FAQ entry可能会回答您的问题:
4.7为什么Python使用某些功能的方法(例如list.index()) 但其他功能(例如 LEN(列表))?
主要原因是历史。功能 用于那些操作 对于一组类型而言是通用的 它们的目的是为了工作 没有方法的对象 所有(例如元组)。也是 方便有一个功能可以 容易应用于无定形 使用时的对象集合 Python的功能特性(map(), apply()et al)。
实际上,实现len(),max(), min()作为内置函数 实际上代码少于实现 它们作为每种类型的方法。一罐 关于个别案件的狡辩但是 它是Python的一部分,它也是 迟到做出这样根本性的改变 现在。功能必须保持 避免大规模的代码破坏。
注意对于字符串操作Python 已从外部职能转移( 字符串模块)方法。然而, len()仍然是一个函数。
列出了所有这些功能(不是太多)here in the docs。
答案 2 :(得分:2)
学习“len”方法后,您就知道可以将它应用于任何序列。您不必阅读您遇到的每个序列的文档,以确定它是否具有len方法。人们期待它的确如此。
内置函数并不难发现,因为python documentation中有一个内置方法列表。您可以在this page中一次性学习它们,而不必在类库Java样式中搜索它们。
答案 3 :(得分:2)
除了MrTopf提供的常见问题答案之外,列表(和其他对象)确实有一个长度方法 __ len __()
len()函数只是调用该方法的简写。
答案 4 :(得分:0)
它们相当容易被发现:
>>> import __builtin__
>>> dir(__builtin__)
['ArithmeticError', 'AssertionError', ...
...
或更好
>>> help(__builtin__)
Help on built-in module __builtin__:
NAME
__builtin__ - Built-in functions, exceptions, and other objects.
...
答案 5 :(得分:-1)
你可以写
re.match(r"\w+", "dog")
而不是
pattern = re.compile(r"\w+")
pattern.match("dog")
就像你注意到的那样,有时它没有意义。