2008-08-29 20 views
8

他の言語で実装されているPython記述子プロトコルのようなものがありますか?あなたのクラスの実装を膨らませることなくモジュール化/カプセル化を増やすいい方法のようですが、他の言語でも同じようなことは聞いたことがありません。ルックアップのオーバーヘッドのために他の言語には存在しない可能性はありますか?他の言語のPython記述子プロトコルアナログ?

答えて

4

私は直接的に同等のものについて聞いたことがありません。おそらくマクロで、特に非常に強力なマクロを持つLispのような言語で同じ効果を達成することができます。

他の言語が非常に強力であるため、類似のものを組み込むことができれば、私は全く驚くことはありません。

0

RubyとC#の両方で、Pythonの場合と同様に、属性に対してgetter/setterメソッドを指定することで、アクセサーを簡単に作成できます。しかし、これはPythonが許しているように、別のクラスにこれらのメソッドのコードを記述できるようにはなっていません。実際には、このクラスの記述子プロトコルで定義された属性が同じクラスに実装されているのを見るたびに、この問題の重要性がわかりません。

EDIT:私のディスレクシア(これは私が不注意な読解を意味する)を訂正します。何らかの理由で私はいつも "デコレータ"として "ディスクリプタ"を読んでおり、その逆もあります。正当な情報を持っているので、私の投稿はそのまま残しておきますが、質問とは全く関係のない情報です。

「デコレータ」という用語自体は、実際には有名な「デザインパターン」の本に記載されているデザインパターンの名前です。 Wikipediaの記事には、さまざまなプログラミング言語のデコレータ使用に関する多くの例が含まれています。http://en.wikipedia.org/wiki/Decorator_pattern

しかし、その記事のデコレータはオブジェクト指向です。 Pythonデコレータは、実行時に関数を別の関数に置き換えることによって機能的に動作し、関数を効果的に変更/置き換えたり、コードを挿入したりすることができます。

これはアスペクト指向プログラミングとして知られており、AspectJ Javaコンパイラではこのようなことを行い、AspectJコード(Javaのスーパーセット)をJavaバイトコードにコンパイルできます。

デコレータのバージョンが何であるかを知るには、C#またはRubyに馴染みがありません。

+0

[記述子プロトコル](http://docs.python.org/ref/descriptors.html)は、[デコレータパターン](http://www.python.org/dev/peps/)と同じではありません。 pep-0318 /)をPythonで - 私は動的に "プロキシ"されている別のオブジェクトの属性にオブジェクトインスタンスを作る機能を指しています。 – cdleary

関連する問題