問題タブ [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.
perl - 新しいMooseクラスを作成し、実行時にそのクラスのオブジェクトをインスタンス化するにはどうすればよいですか?
を使用してメタクラスを作成した後Moose::Meta::Class->create
、そのクラスをメタクラスとして使用して実際のMooseクラスをインスタンス化するにはどうすればよいですか?(メタクラスにもいくつかの役割を適用したいので、メタクラスも作成する必要があります。)
python - メタクラスを使用したファクトリ デザイン パターンの実装
メタクラスに関する多くのリンクを見つけましたが、それらのほとんどは、ファクトリ メソッドの実装に役立つと述べています。メタクラスを使用して設計パターンを実装する例を示してもらえますか?
ruby - Ruby メタクラスの狂気
私は立ち往生しています。クラス メソッドを動的に定義しようとしていますが、Ruby メタクラス モデルについて頭を悩ませることができません。次のクラスを検討してください。
明らかに、両方のメソッドが Class のインスタンスを返します。しかし、これら 2 つのインスタンスは同じではありません。また、祖先も異なります。
メタクラスとクラス インスタンスを区別する意味は何ですか?
メソッドを動的に定義するためにメタクラスにできることがわかりましたsend :define_method
が、それをクラスインスタンスに送信しようとすると機能しません。少なくとも私は自分の問題を解決できましたが、なぜこのように機能しているのかを理解したいと思っています。
2010 年 3 月 15 日 13:40 更新
次の仮定は正しいですか。
- self.instance_eval を呼び出してメソッドを定義するインスタンス メソッドがある場合、そのクラスの特定のインスタンスにのみ影響します。
- self.class.instance_eval (class_eval の呼び出しと同じ) を呼び出すインスタンス メソッドがあり、メソッドを定義すると、その特定のクラスのすべてのインスタンスに影響し、新しいインスタンス メソッドが生成されます。
- instance_eval を呼び出してメソッドを定義するクラス メソッドがある場合、すべてのインスタンスに対して新しいインスタンス メソッドが作成されます。
- meta/eigen クラスで instance_eval を呼び出してメソッドを定義するクラス メソッドがある場合、クラス メソッドになります。
私はそれが私にとって意味を持ち始めていると思います。クラスメソッド内の self が固有クラスを指す場合、可能性は確かに制限されます。その場合、クラス メソッド内からインスタンス メソッドを定義することはできません。あれは正しいですか?
python - Python:クラス名としてユーザー入力を使用するクラスファクトリ
クラス属性をスーパークラスに動的に追加したいと思います。さらに、このスーパークラスから動的に継承するクラスを作成したいので、それらのサブクラスの名前はユーザー入力に依存する必要があります。
実行時に属性を追加できるスーパークラス「Unit」があります。これはすでに機能しています。
これにより、目的の出力が得られます
。Strenght ofmyarcher:5
Strenght ofmyarcher:2
しかし、今はサブクラスArcherを事前に定義したくはありませんが、このサブクラスの呼び出し方法をユーザーに決定させたいと思います。私はこのようなことを試しました:
しかし、運はありません。私はここで何が新しいのか本当に理解していないと思います。結果としてここに欲しいのは
工場で作成されています。そして、「ナイト」という引数でファクトリを呼び出すと、ユニットのサブクラスであるクラスナイトを作成したいと思います。
何か案は?よろしくお願いします!
さようなら
-佐野
python - メタクラス、クラスデコレータを使用する必要がありますか、それとも__new__メソッドをオーバーライドする必要がありますか?
これが私の問題です。次のクラスに一連のプロパティ属性を持たせたいです。foo
とのようにそれらをすべて書き出すかbar
、または私が見た他のいくつかの例に基づいて、クラスデコレータ、メタクラスを使用するか、__new__
メソッドをオーバーライドしてプロパティを自動的に設定できるように見えます。それを行うための「正しい」方法が何であるかはわかりません。
python - カスタムタイプの不変性を強制するためのPythonメタクラス
カスタムタイプの不変性を強制する方法を探し、満足のいく答えが見つからなかったので、メタクラスの形式のソリューションで自分のショットを思いつきました。
ただし、一般的なアプローチはかなりうまく機能しているように見えますが、実装の詳細はまだいくつかあります(コードのTODOコメントも参照してください)。
- 特定のメソッドが型階層のどこかに実装されているかどうかを確認するにはどうすればよいですか?
- どのタイプがメソッド宣言の原点であるか(つまり、どのタイプの一部としてメソッドが定義されているか)を確認するにはどうすればよいですか?
python - クエリセットが統合されたサブクラス化された django モデル
この質問のように、オブジェクトの混合体を返すクエリセットを使用できるようにしたいことを除いて:
Product.Meta.abstract
true に設定することも、異なるオブジェクトのクエリセットを単に OR することもできないことがわかりました。わかりましたが、これらはすべて共通クラスのサブクラスであるため、スーパークラスを非抽象として残しても、そのマネージャーに適切なクラスのオブジェクトを返させることができる限り、満足するはずです。django のクエリ コードはその役割を果たし、Product() を呼び出すだけです。をオーバーライドすると爆発することを除いて、十分に簡単に聞こえますが、モデルProduct.__new__
のせいだと推測してい__metaclass__
ます...これは、私が望むようにほとんど動作する非djangoコードです。
しかし、django.db.models.Model
代わりにから継承すると失敗しますobject
:
これは非常にくだらないバックトレースです。__new__
デバッガーでコードのフレームにステップインすることもできません。super(A, cls)
、Top
、 、および上記のすべてを、最初の引数として にsuper(A, A)
渡すことと組み合わせてさまざまに試しましたが、すべて役に立ちませんでした。なぜこれが私をそんなに激しく蹴っているのですか?これを修正するには、djangoのメタクラスを理解する必要がありますか?それとも、目的を達成するためのより良い方法がありますか?cls
__new__
python - Pythonのtypeとtype.__new__の違いは何ですか?
私はメタクラスを書いていましたが、誤って次のようにしました。
...このようにではなく:
これら2つのメタクラスの違いは正確には何ですか?より具体的には、最初のクラスが正しく機能しなかった原因は何ですか(一部のクラスはメタクラスによって呼び出されませんでした)?
python - RubyのPythonメタクラスに類似したものは何ですか?
Pythonにはメタクラスの概念があり、私が正しく理解していれば、構築時にクラスのオブジェクトを変更できます。クラスを変更するのではなく、作成してから初期化するオブジェクトを変更します。
Python(少なくとも3.0の時点では、私は信じています)にもクラスデコレータのアイデアがあります。繰り返しになりますが、私が正しく理解していれば、クラスデコレータは、宣言されている時点でクラス定義を変更できます。
今では、Rubyのクラスデコレータと同等の機能があると思いますが、現在、メタクラスと同等の機能を認識していません。いくつかの関数を介してRubyオブジェクトを簡単にポンピングし、それに対して実行できることは確かですが、メタクラスのように設定する機能は言語にありますか?
繰り返しになりますが、RubyにはPythonのメタクラスに似たものがありますか?
編集私はPythonのメタクラスに参加していませんでした。メタクラスとクラスデコレータは、見た目と非常によく似た動作をします。どちらも、定義時にクラスを変更しますが、方法は異なります。うまくいけば、Pythonの第一人者がやって来て、Pythonのこれらの機能についてよりよく説明するでしょう。
ただし、クラスまたはクラスの親は__new__(cls[,..])
、オブジェクトがで初期化される前に、オブジェクトの構造をカスタマイズする関数を実装できます__init__(self[,..])
。
編集この質問は主に、2つの言語がこれらの機能でどのように比較されるかについての議論と学習のためのものです。私はPythonに精通していますが、Rubyには精通しておらず、興味がありました。うまくいけば、2つの言語について同じ質問をしている他の人が、この投稿が役に立ち、啓発的であることがわかるでしょう。