他の言語で実装されている Python 記述子プロトコルのようなものはありますか? 包含クラスの実装を肥大化させずにモジュール性/カプセル化を高める良い方法のように思えますが、他の言語で同様のことを聞いたことがありません。ルックアップのオーバーヘッドのために、他の言語には存在しない可能性がありますか?
2 に答える
直接同等のものについても聞いたことがありません。特に非常に強力なマクロを持つ Lisp のような言語では、おそらくマクロを使って同じ効果を得ることができます。
非常に強力なため、他の言語が同様のものを取り入れ始めても、まったく驚かないでしょう。
RubyとC#はどちらも、Pythonの場合と同様に、属性にgetter / setterメソッドを指定することで、アクセサーを簡単に作成できます。ただし、これは、Pythonで許可されている方法で、これらのメソッドのコードを別のクラスに自然に記述できるように設計されていません。実際には、記述子プロトコルを介して定義された属性を見るたびに同じクラスに実装されているため、これがどれほど重要かはわかりません。
編集:私の失読症を酷評します(それによって私は不注意な読書を意味します)。どういうわけか、私が両方を入力している場合でも、私は常に「descriptor」を「decorator」と読み、その逆も同様です。質問とはまったく関係のない情報ですが、有効な情報が含まれているため、投稿はそのままにしておきます。
「デコレータ」という用語自体は、実際には有名な「デザインパターン」の本に記載されているデザインパターンの名前です。ウィキペディアの記事には、デコレータの使用法のさまざまなプログラミング言語での多くの例が含まれています:http: //en.wikipedia.org/wiki/Decorator_pattern
ただし、その記事のデコレータはオブジェクト指向です。それらには、別の既存のクラスが何らかの形で異なる動作をするようにする事前定義されたインターフェイスを実装するクラスがあります。Pythonデコレータは、実行時に関数を別の関数に置き換えることで機能的に動作し、その関数を効果的に変更/置換したり、コードを挿入したりできます。
これはJavaの世界ではアスペクト指向プログラミングとして知られており、AspectJ Javaコンパイラを使用すると、これらの種類の処理を実行して、AspectJコード(Javaのスーパーセット)をJavaバイトコードにコンパイルできます。
私はC#やRubyに精通していないため、デコレータのバージョンがどうなるかを知ることができません。