在Python中提供全局范围中的一些默认方法的原因是什么?

时间:2009-02-20 22:37:45

标签: python function

在全局范围内提供某些默认方法(如len函数)的原因是什么,而不是在实例级别提供它们,例如:

list.len()

而不是:

len (list)

我发现像len这样的方法比实例方法更难发现。

这背后有什么理由吗?

6 个答案:

答案 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")  

就像你注意到的那样,有时它没有意义。