Pythonでは、各オブジェクトに1つの名前空間があります。その名前空間でアクセス可能なオブジェクトの「属性」は、メソッド、他のオブジェクトへの単純な参照(呼び出し可能かどうか)、または記述子によってオンザフライで合成できます(プレーン属性はインスタンスまたはクラス内ですが、記述子(メソッドを合成する記述子としての関数を含む)は、インスタンスではなくクラスに存在する場合にのみ使用されます。したがって、特に「特別なメソッド」は、クラスで定義されている場合にのみ特別です。インスタンスではありません)。属性処理ビルトインと特別なメソッド(、、、、、 ...)はgetattr
、 「プレーン属性」を参照しているかどうかに関係なく、オブジェクトの単一の名前空間全体でまったく同じように機能します。setattr
__getattr__
__setattr__
重要な点はa
、Pythonの任意のオブジェクトはa.b
、メソッド(または他の呼び出し可能)であるかどうかです。Pythonコンパイラは、参照を取得してa.b
(たとえば)引数として渡すことができます(気にしない)。 、結果として返し、リストに追加するなど、これらの操作はいずれも。を呼び出す a.b
ことを意味しません。を(試して)呼び出したい場合a.b
は、かっこを後置して明示的a.b()
に呼び出します。引数なしで呼び出したい場合。
Rubyでは、オブジェクトのメソッドと属性は別々の名前空間に存在し(したがって、Pythonではできない、同じ名前のメソッドと属性を持つオブジェクトを持つことができます)、引数のないメソッドを暗黙的に「言及」します。それを呼び出します(したがってc=a.b
、属性参照を取得している場合もa.b()
あれば、呼び出している場合もあります。b
でメソッドと属性の両方に名前を付ける場合a
、使用を明確にするためにどのヒューリスティックルールが使用されているか思い出せません)。したがって、メソッド参照を取得し(たとえば、コンテナに格納したり、引数または戻り値として使用したりする場合)、後で呼び出しを実行する場合は、別の構文を使用します。
SmalltalkにもRubyのように個別の名前空間がありますが、特定のオブジェクトの「非メソッド」属性を参照することはできません(各オブジェクトはそれ自体の属性を「見る」だけです)ので、このあいまいさは発生しません(ただし、まだあります)特定のメッセージを使用して抽出し、後で「メソッド参照」を呼び出すため)。