15

最近、Pythonでメタクラスを発見しました。

基本的に、Pythonのメタクラスは、クラスを作成するクラスです。これを実行する理由はたくさんあります。たとえば、あらゆる種類のクラスの初期化です。工場でのクラスの登録、属性の複雑な検証、継承の仕組みの変更など。これらすべてが可能になるだけでなく、簡単になります。

しかし、Pythonでは、メタクラスもプレーンクラスです。それで、私は抽象化が有用にもっと高くなることができるかどうか疑問に思い始めました、そしてそれが可能であるように私には思えます:

  • メタクラスは、パターン内の役割に対応するか、その役割を実装します(GOFパターン言語の場合と同様)。
  • メタメタクラスはパターン自体です(単一のクラスではなく、抽象的な役割を表すクラスのタプルを作成できる場合)
  • meta-meta-metaclassはパターンファクトリであり、GOFパターングループ(作成、構造、動作など)に対応します。特定のタイプの問題のケースを記述でき、それを解決する一連のクラスを提供するファクトリ。
  • meta-meta-meta-metaclass(私が知る限り)は、パターンファクトリファクトリです。これは、問題のタイプを説明できるファクトリであり、パターンファクトリに問い合わせることができます。

私はこれについてオンラインでいくつかのことを見つけましたが、ほとんどの場合あまり役に立ちません。1つの問題は、言語が異なればメタクラスの定義もわずかに異なることです。

他の誰かがpython/elsewhereでこのようなメタクラスを使用したり、これが実際に使用されているのを見たり、考えたりしたことがありますか?他の言語の類似物は何ですか?たとえば、C ++では、テンプレートの再帰はどのくらい深くなることができますか?

さらに調べてみたいと思います。

4

5 に答える 5

18

これは、「パターンの一般的な実装」を作成するために一部の人々が行っているように見える永遠の探求を思い出させます。任意のオブジェクト (別の factory を含む) を作成できる factory や、実際に何かを実行するコードを単に記述するよりも管理がはるかに複雑な汎用依存性注入フレームワークのように。

Zend Framework プロジェクトを管理していたとき、私は抽象化に熱心な人たちに、へそを見つめるほど対処しなければなりませんでした。私は、何もしないコンポーネントを作成するという多くの提案を断りました。それらは、パターンが目標への手段ではなく、それ自体が目標であるかのように、GoF パターンの魔法のような実装に過ぎませんでした。

抽象化には、収穫逓減のポイントがあります。ある程度の抽象化は素晴らしいものですが、最終的には何か役に立つコードを書く必要があります。

そうでなければ、それはただのカメです。

于 2009-01-24T21:00:00.587 に答える
8

2007 年の History of Programming Languages カンファレンスで、サイモン ペイトン ジョーンズは、Haskell では型クラスを使用したメタ プログラミングが可能であるが、実際には完全にタートルであるとコメントしました。Haskell で meta-meta-meta-meta などのプログラムを作成することはできますが、3 レベル以上の間接化を使用している人は聞いたことがありません。

Guy Steele は、Lisp と Scheme で同じことを指摘しました。バックティックと eval を使用してメタプログラミングを行うことはできますが (バックティックは Python のラムダと考えることができます)、3 つ以上のバックティックが使用されているのを見たことがありません。

おそらく、彼らはあなたや私よりも多くのコードを見てきているので、3 レベルのメタを超えた人は誰もいないと言っても過言ではありません。

考えてみれば、ほとんどの人はメタプログラミングを使用したことがなく、2 つのレベルを理解するのは非常に困難です。3人はほとんど不可能だと思います.4人を最後に試した人は亡命しました.

于 2010-01-19T00:39:14.637 に答える
8

あなたの質問に答えるには:いいえ。

それをさらに研究してください。

ただし、設計パターン (単なるアイデア) とコード (実装) を混同していることに注意してください。

優れたコードは、多くの場合、連動する多くの設計パターンを反映しています。これを形式化する簡単な方法はありません。あなたができる最善のことは、さまざまな設計パターンを反映した、見栄えの良い画像、適切に記述されたドキュメントストリング、およびメソッド名です。

また、メタクラスはクラスであることに注意してください。それがループです。より高いレベルの抽象化はありません。その時点で、それはただの意図です。メタ-メタ-クラスの概念はあまり意味がありません。メタクラスのメタクラスであり、ばかげていますが、技術的には可能です。ただし、それはすべて単なるクラスです。


編集

「メタクラスを作成するクラスは本当にばかげているのでしょうか? それらのユーティリティはどのようにして突然使い果たされるのでしょうか?」

クラスを作成するクラスは問題ありません。それだけです。ターゲット クラスがメタ クラス、抽象スーパークラス、または具象クラスであるという事実は重要ではありません。メタクラスはクラスを作ります。彼らは他のメタクラスを作成するかもしれませんが、これは奇妙ですが、クラスを作成するメタクラスにすぎません。

別のメタクラスを作成するメタクラスには実際に必要なものがない (または書き込むことさえできない) ため、ユーティリティは "突然" 不足します。「いきなり」おかしくなるわけじゃない。そこには何の役にも立たないということです。

私が種をまくので、自由に研究してください。たとえば、別のメタクラスを構築するメタクラスを実際に作成します。楽しむ。そこに役立つものがあるかもしれません。

OO のポイントは、実世界のエンティティをモデル化するクラス定義を作成することです。そのため、メタクラスは、いくつかの関連するクラスの横断的な側面を定義するのに便利な場合があります。(これは、アスペクト指向プログラミングを行う方法の 1 つです。) メタクラスが実際に実行できるのはこれだけです。__new__()など、クラス自体の適切な部分ではないいくつかの関数を保持する場所です。

于 2009-01-24T20:49:28.050 に答える
4

Smalltalk のクラス システムは興味深い研究対象です。Smalltalk では、すべてがオブジェクトであり、すべてのオブジェクトにクラスがあります。これは、階層が無限になることを意味するものではありません。私の記憶が正しければ、次のようになります。

5 -> 整数 -> 整数クラス -> メタクラス -> メタクラス クラス -> メタクラス -> ... (ループします)

「->」は「のインスタンス」を示します。

于 2009-01-24T22:08:59.513 に答える