我知道 python 有一个用于确定字符串的大小的len()函数,但我想知道为什么它不字符串对象的方法。

更新

好了,我意识到我的 embarrassingly 错误。__len__()是实际字符串对象的方法。似乎只是奇怪看到中使用 len 函数基于字符串对象的 Python 的面向对象的代码。此外,也很奇怪看到名称而不是只是长度为__len__

2008-10-25 22:37:03
问题评论:

回答:

字符串的长度的方法有︰ __len__()

Python 中的协议是具有一定长度的对象上实现此方法,并使用内置len()函数,调用它,类似的方式需要实现__iter__()并使用内置的iter()函数 (或已调用该方法在幕后为您) iterable 的对象上。

有关详细信息,请参阅Emulating 容器类型

这里有良好的读,在 Python 中的协议主题︰ Python 不已原则的最少

它 astonishes moronic 方式,使用len的原因是我。他们认为,可以很方便地强制实施而强迫人们来实现.len().__len__人。其同样的工作和一个看上去清洁剂。如果将具有__len__OOP 语言,使len(..)的点是什么世界

长度,str 等可与高阶函数映射、 减少和筛选而无需像定义一个函数或只是为了调用方法的 lambda。有些事情不围绕 OOP,即使在 Python 中。

此外,通过使用一种协议,它们可以提供其他方法实现的事情。例如,使用__iter__,或仅为__getitem__,您可以创建 iterable 和iter(x)将使用两种方法。您可以创建一个可用的布尔值的上下文对象与__bool____len__,和bool(x)将使用两种方法。等等等等。我认为 Armin 解释此链接的文章中很好地 — — 但即使没有他,调用 Python moronic 由于外部的通常是公开核心开发人员与专家解释不完全是公平...

@Evicatos︰ 为 + 1"不是一切都围绕 OOP",但我总会用"特别是在 Python 中",甚至(而不像 Java,Ruby 或由 Smalltalk) Python 不尝试是一种"纯 OOP"语言;它具有显式设计是一种"多模式"的语言。列表中包含不是 iterables 上的方法。zip是顶级的函数,而不是zip_with方法。等等等等。只是因为一切都是一个对象,并不意味着一个对象是有关每一件事情最重要的事情。

这篇文章是因此编写不当感到混淆和生气后试图读取它。"在 Python 中 2.x 的元组类型实例不会公开任何非特殊的方法,尚未使用它使从它的字符串:"整件事是在附近-无法解读的句子的组合体。

Jim 的这个问题的答案可能会有所帮助;我在此处复制了它。报价 Guido van Rossum:

首先,我选择了 len(x) 在 x.len() 上的 HCI (def __len__() 是晚得多) 的原因。有两个缠结在一起的原因实际上,两个 HCI:

(a) 对于某些操作,前缀表示法只需读取优于后缀-前缀 (和中缀 !) 操作在其喜欢的视觉效果,帮助思考问题的数学家的表示法的数学有长的传统。比较容易与我们重写像 x*(a+b) 公式到 x * + x * b 到的做同样的事情,使用原始的 OO 表示法显得笨拙。

(b) 当我阅读代码,len(x) 说︰ 我知道请求的内容长度。这告诉我两件事︰ 结果是一个整数,并且参数为某种类型的容器。相反,当我读 x.len(),我不得不已经知道 x 是某种类型的容器实现接口或标准的 len () 的类继承。见证我们偶尔会有不实现一个映射的类具有 get() 或 keys() 的方法,或一些不是一个具有 write () 方法时的混乱。

我说同样的事情在另一种方式,看到内置操作长度。我会恨你失去的。/…/

HCI 代表什么?

人类的计算机接口

并且这是为什么,如果您需要好的多态性,您使用的语言具有正常的推理。请参见︰ 转,Haskell,CLOS。如果鸭子 bites 您的屁股,鸭子类型化的点是什么?

人类的计算机交互 *

还有的len方法︰

>>> a = 'a string of some length'
>>> a.__len__()
23
>>> a.__len__
<method-wrapper '__len__' of str object at 0x02005650>

Python 是一种实用的编程语言和len()函数和str的而不是方法的原因,listdict等务实。

len()内置函数直接处理内置类型︰ len()的 CPython 实现实际上在PyVarObject C 结构,它表示内存中的任何大小可变的内置对象返回ob_size字段中的值。这是更快地调用的方法--没有任何属性查找需要发生这种情况。获取集合中项的数目是常见操作, strlistarray.array等作为这种基本的多种类型必须有效地工作。

但是,为了促进一致性,,将len(o)应用到用户定义的类型时,Python 调用o.__len__()作后备。__len____abs__和所有其他特殊方法记录在Python 数据模型使其可以轻松地创建对象的行为类似于 built-ins,使我们所说的"Pythonic"丰富且具有高度一致性的 Api。

通过实施特殊对象可以支持迭代的方法,来重载中缀运算符、 管理的上下文中with块等。您可以将作为一种使用 Python 语言本身作为一个框架,在其中可以无缝地集成创建的对象的数据模型。

第二个原因,像这样,从 Guido van Rossum 报价支持是很方便地读取和写入len(s)s.len().

表示法len(s)是符合一元运算符使用前缀表示法,如abs(n)abs(),比方法更容易使用len()和应有的重视是很容易编写。

可能也有历史的原因︰ 在 ABC 语言 Python 的前面 (并且是在其设计中非常重要的影响) 中,已写成#s ,这意味着len(s)的一元运算符.

met% python -c 'import this' | grep 'only one'
There should be one-- and preferably only one --obvious way to do it.

明显的一点时使用对象,当然,一种方法。

@Peter︰ 我需要支付 20 美元的人它们绑到 Guido 的背面批注的照片证据。50 美元在他的额头上。

是的 Python 设计人员遵守 dogma 但他们自己不尊重自己 dogma。

$ python-c 导入此 |grep 明显

请输入您的翻译

Is there a reason Python strings don't have a string length method?

确认取消