問題タブ [metaclass]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python:メタクラスはずっと下にあります
Pythonメタクラスに関する難解な質問があります。クライアント側のプロキシを介して任意のPythonクラスに簡単にアクセスできるようにするWebサーバー側のコード用のPythonパッケージを作成しています。プロキシ生成コードには、APIに含めたいすべてのPythonクラスのカタログが必要です。このカタログを作成するために、__metaclass__
特別な属性を使用して、クラス作成プロセスにフックを設定しています。具体的には、「公開された」APIのすべてのクラスは、クラスの作成に関する情報を記録するように設定された特定の基本クラスをサブクラスPythonDirectPublic
化します。__metaclass__
ここまでは順調ですね。複雑になるのは、自分PythonDirectPublic
自身をサードパーティのクラス()から継承させたいということですenthought.traits.api.HasTraits
。このサードパーティクラスもを使用し__metaclass__
ます。
では、2つのメタクラスを管理する正しい方法は何ですか?私のメタクラスはEnthoughtのメタクラスのサブクラスである必要がありますか?または、メタクラスのメソッド内でEnthoughtのメタクラスを呼び出して、__new__
返される型オブジェクトを取得する必要がありますか?または、この特定の状況で使用する他の神秘的な呪文はありますか?
delphi - Delphi クラス参照...別名メタクラス...それらをいつ使用するか
私は公式ドキュメントを読み、クラス参照とは何かを理解していますが、それらが代替手段と比較して最適な解決策である時期と理由を理解していません。
ドキュメントで引用されている例は、TCollectionItem の任意の子孫でインスタンス化できる TCollection です。クラス参照を使用する正当な理由は、コンパイル時に型が不明なクラス メソッドを呼び出すことができるためです (これは TCollection のコンパイル時であると想定しています)。TCollectionItemClass を引数として使用することが、TCollectionItem を使用するよりも優れていることを理解していません。TCollection は引き続き TCollectionItem の子孫を保持でき、TCollectionItem で宣言された任意のメソッドを呼び出すことができます。そうじゃない?
これを一般的なコレクションと比較してください。TObjectList は、TCollection とほぼ同じ機能を提供するように見えますが、タイプ セーフの利点が追加されています。オブジェクト タイプを格納するために TCollectionItem から継承する必要がなくなり、必要に応じてタイプ固有のコレクションを作成できます。また、コレクション内からアイテムのメンバーにアクセスする必要がある場合は、一般的な制約を使用できます。Delphi 2009 より前のプログラマがクラス参照を利用できるという事実以外に、ジェネリック コンテナよりもクラス参照を使用する説得力のある理由はありますか?
ドキュメントに示されている他の例は、オブジェクト ファクトリとして機能する関数にクラス参照を渡すことです。この場合、TControl 型のオブジェクトを作成するためのファクトリです。あまり明白ではありませんが、TControl ファクトリは、TControl のコンストラクタではなく、渡された子孫型のコンストラクタを呼び出していると想定しています。この場合、少なくともクラス参照を使用する何らかの理由が見えてきます。
だから私が本当に理解しようとしているのは、いつ、どこでクラス参照が最も適切で、開発者は何を買うのかということだと思います.
python - Pythonでメタクラスの定義をインライン化するのはいつですか?
今日、私はここでPythonのメタクラスの驚くべき定義に出くわしました。メタクラスの定義は、効果的にインライン化されています。関連する部分は
このようなインライン定義を使用するのはいつ意味がありますか?
さらなる議論:
1つの方法として、作成されたメタクラスはこの手法を使用して他の場所で再利用できないという議論があります。反対の議論は、メタクラスを使用する際の一般的なパターンは、メタクラスを定義し、それを1つのクラスで使用し、それから継承することです。たとえば、保守的なメタクラスでは、定義
次のように書くことができます
その他の考慮事項はありますか?
python - パラメータ化されたクラスとメタクラスの違いは何ですか (Python のコード例を参照してください)。
スタック オーバーフローの貢献者の皆様、こんにちは。
私は現在 Python を学んでいる初心者のプログラマーで、オブジェクト指向のパラダイムを説明するのに役立つこのサイトにたどり着きました。メタクラスがクラスのクラスであることは知っていますが (メタディレクトリがディレクトリのディレクトリであるなどのように)、何か問題があります:メタクラスとパラメータ化されたクラスの実際の違いは何ですか?ウェブサイトの定義?
可能であれば、2 つの違いを示す Python のコード例を含めてください。ご協力ありがとうございました!
python - SQLAlchemy宣言型ベースとのメタクラスの競合への対処
class X
独自のメタクラスを持つクラスから派生したaがありますMeta
。また、SQLAlchemyの宣言型ベースからXを導出したいと思います。しかし、私は単純なことはできません
メタクラスの競合エラーが発生するため、「派生クラスのメタクラスは、そのすべてのベースのメタクラスの(厳密ではない)サブクラスである必要があります」。Metaと、宣言型ベースが使用するメタクラス(DeclarativeMetaだと思いますか?)の両方から派生する新しいメタクラスを作成する必要があることを理解しています。だから、書くだけで十分です:
私はこれを試しましたが、うまくいくようです。しかし、私はこのコードに何らかの問題を引き起こしたのではないかと心配しています。
マニュアルを読みましたが、少しわかりにくいです。何ですか
編集:
私のクラスに使用されるコードは次のとおりです。
python-3.x - python:クラスの__dict__を操作する
(すべてActivePython 3.1.2で)
(インスタンスではなく)クラス属性を変更しようとしました。__dict__
メタクラスのは完璧な解決策のようでした。しかし、変更しようとすると、次のようになりました。
TypeError:'dict_proxy'オブジェクトはアイテムの割り当てをサポートしていません
なぜ、そして私はそれについて何ができますか?
編集
クラス定義内に属性を追加しています。
setattr
クラスがまだ構築されていないために機能しません。したがって、まだ参照できません(または少なくとも方法がわかりません)。
多数の属性を追加しているため、従来の割り当ては機能しません。属性の名前は特定のルールによって決定されます(したがって、単に入力することはできません)。
言い換えれば、私が;を通してclass A
属性を持ちたいとしましょう。そして、それらすべてを完全に構築する前に定義する必要があります(そうしないと、SQLAlchemyが適切に計測しないため)。A.a001
A.a999
また、元のタイトルでタイプミスをしたことにも注意してください__dict__
。変更したいのは、メタクラスではなく、通常のクラスです。
python - Python:メタクラスの__new__のタイミング
次のコードはコンパイルされません。それは言う
NameError:名前'フィールド'が定義されていません
最後の行に。課題に到達__new__
するまで呼び出されないからですか?fields
私は何をすべきか?
編集:
タイミングの問題ではないことがわかりました。名前の非表示に問題があります。A.fields
代わりに書くとうまくいきます。
fields
なぜ使えないのか知りたいのですがsuper().fields
。
python - Python:関数であるクラス変数がメソッドとして理解されないようにする方法は?
私は現在djangoアプリを実装しています。このため、Djangoの構文と一致する構文を使用しようとしています...
だからここに私が試しているものがあります:
sort_key
は(ソートの目的で)重要な関数ですが、もちろん、Meta
のメソッドとして理解されています(これは絶対に私が望むものではありません)!!!
これに対する回避策はありますが、それでもこの構文を使用できますか?
編集:ちょうど重要な精度...私が書いたコードは、ライブラリを使用する誰かによって書かれることになっています!だから私は汚いトリックをしたくないのです。そして、DjangoではYESです。これは、実際にはオプションにのみ使用されます...もちろん、Metaはクラスですが、クラスとして使用されないため、「クラスとしては表示されません」と言います。インスタンス化しないでください。クラスメソッドを配置せず、クラス属性のみを配置します...には、これからすべてを抽出し、宣言されたすべてのオプションを処理Model
するメタクラスがあります...しかし、それだけです!Meta
これは、オプションの単なるプレースホルダーです。
しかし、それは本当です。Djangoの関数であるオプションを見たことがありません...したがって、Nedに従って、この並べ替え関数をそのメソッドとしてModel
オーバーライドする必要があると宣言します...
python - Python 2.5 で Python 3 メタクラスの __prepare__ 特殊メソッドをエミュレートする方法はありますか?
私のプロジェクトでは、Python 2.5 (Google App Engine) に固執する必要があります。アプリケーション (実際にはフレームワーク) のどこかで、どの変数が定義され、どの順序で定義されているかを追跡する必要があります。つまり、代入演算子が処理されるたびにインターセプトしたいと考えています。
__prepare__
Python 3 を使用して、いつアクセスされたかを追跡するインテリジェントな辞書を返すメソッドを持つメタクラス M を定義します。次に、メタクラス M を使用してクラス ステートメント内のすべてを実行する必要があります。
これを Python 2.5 でエミュレートする方法はありますか?
私が達成したいことの例
Python 3 のメタクラス アプローチを使用すると、参照のように機能する変数を実装できます。たとえば、M はそのようにすることができます。
は (C の作成まで) と同等ですy(1)
。つまり、ブラック ボックスref
関数による C の辞書内の変数への最初の代入により、この変数が作成されます。追加の割り当ては、ref 関数のパラメーターを呼び出すだけです。
c++ - 継承をパラメータ化するメタクラス
Pythonメタクラスに関するチュートリアルをいくつか読みました。これまで使用したことはありませんが、比較的単純なものに1つ必要であり、すべてのチュートリアルははるかに複雑なユースケースを対象としているようです。基本的に、事前に指定された本体を持つテンプレートクラスを作成したいのですが、その基本クラスをパラメーターとして受け取ります。C ++ / Dテンプレートからアイデアを得たので、C++で記述したいコードの例を次に示します。