226

Pythonに文字列の大きさを求める関数があることは知っているのlen()ですが、なぜ文字列オブジェクトのメソッドではないのか疑問に思っていました。

アップデート

わかりました、恥ずかしいほど間違っていたことに気付きました。__len__()実際には文字列オブジェクトのメソッドです。文字列オブジェクトに対して len 関数を使用する Python のオブジェクト指向コードを見るのは奇妙に思えます。__len__さらに、ただのlenではなく、名前として見るのも変です。

4

9 に答える 9

193

文字列には length メソッドがあります。__len__()

Python のプロトコルは、長さを持ち、組み込み関数を使用するオブジェクトにこのメソッドを実装することです。組み込み関数を実装して使用するlen()方法と同様に、組み込み関数を使用します (またはメソッドを背後で呼び出す方法があります)。あなたのためのシーン) 反復可能なオブジェクト。__iter__()iter()

詳細については、コンテナー タイプのエミュレートを参照してください。

Python のプロトコルについては、次の記事を参照してください: Python and the Principle of Least Astonishment

于 2008-10-25T22:51:19.217 に答える
103

この質問に対するジムの答えが役立つかもしれません。ここにコピーします。グイド・ヴァン・ロッサムの引用:

まず第一に、HCI の理由から x.len() よりも len(x) を選択しました (def __len__() はずっと後に来ました)。実際には 2 つの絡み合った理由があり、どちらも HCI です。

(a) 一部の演算では、前置記法は後置記法よりも読みやすくなります — 前置記法 (および中置記法!) 演算は数学において長い伝統があり、ビジュアルが数学者が問題について考えるのに役立つ記法を好みます。x*(a+b) のような式を x*a + x*b に書き換える簡単さと、生の OO 表記を使用して同じことを行う不器用さを比較してください。

(b) len(x) というコードを読むと、何かの長さを要求していることがわかります。これは、結果が整数であることと、引数がある種のコンテナであることの 2 つを示しています。逆に、x.len() を読むときは、x がインターフェイスを実装するか、標準の len() を持つクラスから継承するある種のコンテナーであることを既に知っている必要があります。マッピングを実装していないクラスに get() または keys() メソッドがある場合、またはファイルではない何かに write() メソッドがある場合に、時々混乱することがあります。

同じことを別の言い方をすれば、「len」は組み込み操作だと思います。それを失うのはもったいない。/…/

于 2008-10-26T01:11:08.340 に答える
37

方法がありますlen

>>> a = 'a string of some length'
>>> a.__len__()
23
>>> a.__len__
<method-wrapper '__len__' of str object at 0x02005650>
于 2008-10-25T22:49:54.163 に答える
12
met% python -c 'import this' | grep 'only one'
There should be one-- and preferably only one --obvious way to do it.
于 2008-10-25T22:38:58.227 に答える
-1

あなたも言うことができます

>> x = 'test'
>> len(x)
4

Python 2.7.3 を使用。

于 2013-01-04T23:44:59.463 に答える
-2

そうじゃない?

>>> "abc".__len__()
3
于 2008-10-26T01:50:18.153 に答える