その理由は主に歴史的なものですが、Pythonlen
にはメソッドの代わりに関数を適切に使用するいくつかの特殊性があります。
Python の一部の操作はメソッドとして実装されます (例:list.index
およびdict.append
)。他の操作は、呼び出し可能オブジェクトおよび魔法のメソッドとして実装されます (例:str
およびiter
および ) reversed
。2 つのグループは十分に異なるため、異なるアプローチが正当化されます。
- それらは一般的です。
str
、int
および友人はタイプです。コンストラクターを呼び出す方が理にかなっています。
- 実装は関数呼び出しとは異なります。たとえば、が使用できない場合に
iter
呼び出す可能性があり、メソッド呼び出しに収まらない追加の引数をサポートします。同じ理由で、最近のバージョンの Python ではに変更されています - より理にかなっています。__getitem__
__iter__
it.next()
next(it)
- これらのいくつかは、オペレーターの近親者です。呼び出すための構文があります
__iter__
-__next__
それはfor
ループと呼ばれます。一貫性のためには、関数の方が優れています。そして、それは特定の最適化のためにそれをより良くします。
- 一部の機能は、何らかの点で残りの機能にあまりにも似て
repr
いstr
ます。str(x)
対を持つx.repr()
ことは混乱を招くでしょう。
- それらのいくつかは、実際の実装方法をめったに使用しません
isinstance
。
- それらの一部は実際のオペレーターで
getattr(x, 'a')
あり、別の方法であり、前述の資質の多くを共有しx.a
ています。getattr
私は個人的に、最初のグループをメソッドのように、2 番目のグループを演算子のように呼んでいます。あまり良い区別ではありませんが、何らかの形で役立つことを願っています。
そうは言ってlen
も、2番目のグループには正確には当てはまりません。最初の操作に近いですが、ほとんどの操作よりも一般的であるという唯一の違いがあります。しかし、それが行うのは を呼び出すことだけで__len__
あり、 に非常に近いL.index
です。ただし、いくつかの違いがあります。たとえば__len__
、 などの他の機能の実装のために が呼び出される可能性がありますbool
。メソッドが呼び出された場合、まったく異なることを行うカスタムメソッドでlen
壊れる可能性があります。bool(x)
len
要するに、クラスが実装する可能性のある非常に一般的な機能のセットがあり、オブジェクトの構築中に、オペレーター、特別な関数 (通常、オペレーターが行うように実装以上のことを行います) を介してアクセスできます。いくつかの共通の特徴を共有します。残りはすべてメソッドです。そしてlen
、その規則の例外です。