問題タブ [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.

0 投票する
2 に答える
515 参照

python - Python、Zope コンポーネント アーキテクチャ、アダプターの登録

スタンドアロンの python アプリケーションでは、アプリケーションのアダプターを登録してアクセスするためにzope.interfacezope.componentパッケージを使用します。メタクラスの概念を使用して、メタクラスのinitメソッド内からアダプターを登録できると考えました。これにより、アダプターの登録プロセスが「自動化」されます。たとえば、zope パッケージがクラスに追加する属性を使用するなど、このアプローチに問題はありますか? ご意見をお寄せいただきありがとうございます。

0 投票する
5 に答える
27022 参照

python - クラス定義の後にメタクラスを設定する方法はありますか?

クラスのメタクラスを設定するには、__metaclass__属性を使用します。メタクラスはクラスの定義時に使用されるため、クラス定義の後に明示的に設定しても効果はありません。

これは、メタクラスを明示的に設定しようとすると起こることです。

私が考えることができる最良のアイデアは、クラス全体を再定義し、__metaclass__何らかの方法で属性を動的に追加することです。または、クラス定義の後にメタクラスを設定するより良い方法を知っていますか?

0 投票する
2 に答える
1699 参照

python - unittestとmetaclass:自動test_*メソッド生成

フレームワークのテストを作成すると、次のパターンに気付き始めます。

test_feat_*そのため、メタクラスを使用して、これらのタイプのテストクラスのメソッドをプログラムで作成したいと思います。つまり、署名付きのプライベートメソッドごとに、署名付き_test_{featname}(self, arg)の2つのトップレベルの検出可能なメソッドとtest_{featname}_true(self)test_{featname}_false(self)作成する必要があります。

私は次のようなものを思いついた:

私は次のような出力を期待しています:

しかし、私が得たのは:

私が見逃しているいくつかの閉鎖規則があるようです。これを回避するにはどうすればよいですか?より良いアプローチはありますか?

ありがとう、

編集:修正されました。スニペットを参照してください。

0 投票する
1 に答える
1964 参照

python - 鼻、unittest.TestCase およびメタクラス: 自動生成された test_* メソッドが検出されない

これは、ユニットテストとメタクラスのフォローアップの質問です: 自動 test_* メソッド生成:

この (固定) unittest.TestCase レイアウトの場合:

これは、stdlibのフレームワークを使用して機能します。期待される出力と実際の出力:

しかし、私は実際にを使っているので、このトリックは合わないようです。私が得た出力は次のとおりです。

つまり、メタクラスによって生成されたメソッドは、ノーズtest_*に登録されません。誰でもこれに光を当てることができますか?

ありがとう、

0 投票する
6 に答える
39755 参照

python - 定義時にクラスを自動登録する方法

クラスの定義時にクラスのインスタンスを登録したい。理想的には、以下のコードでうまくいくでしょう。

残念ながら、このコードではエラーが発生しますNameError: global name 'MyClass' is not defined

何が起こっているかは、#problem hereインスタンス化しようとしている行にありますMyClassが、デコレータはまだ返されていないため、存在しません。

メタクラスなどを使用してこれを回避する方法はありますか?

0 投票する
3 に答える
947 参照

python - Python : メタクラス + ラップされたメソッド + 継承 = 問題

Python で問題が発生しましたが、明確な解決策が見つかりません...

いくつかのメソッドを呼び出すときに、メソッドの実行前と実行後にいくつかのコードを実行したい。context(他の多くのことの中で)変数を自動的に設定および消去するため。

これを実現するために、次のメタクラスを宣言しました。

これは魅力のように機能します:

しかし、 をサブクラス化するとすぐにParent、親メソッドを次のように呼び出すと、問題が発生しますsuper

新しい値に設定する前にコンテキストを保存することを考えましたが、それは問題を部分的にしか解決しません...

確かに、(ちょっと待ってください、これは説明が難しいです)、親メソッドが呼び出され、ラッパーが実行されますが、それらは を受け取り*args**kwargsアドレス指定されますParent.testwhileselfChildインスタンスであるためself*argsand **kwargs(たとえば、自動検証の目的で)、例:

したがって、基本的に、この問題を解決するには、次の 2 つの解決策があります。

  1. メソッドが呼び出されたときにラッパーが実行されるのを防ぎますsuper(Child, self)

  2. self常に「正しい」タイプのを持っている

両方の解決策は私には不可能に思えます...誰かがこれを解決する方法について考えを持っていますか? 提案 ?

0 投票する
1 に答える
288 参照

python - スプーフィング Python 演算子の優先順位

2 つのオブジェクトを比較しlhs == rhs、両方が defineを返すとき、が返されるか、のサブクラスでない限り__eq__、単に呼び出されることを知っています。lhs.__eq__NotImplementedrhslhs

arbitrary_object.__eq__ただし、実装の詳細に関係なく、比較ステートメントの位置に関係なく、インスタンスが任意のオブジェクトと比較しながら、言いたいことを言う機会が与えられるクラスを実装したいと思います。少しぎこちなく聞こえるかもしれませんが、私はちょっとしたテスト指向のプロジェクトに取り組んでいtestmania.expectます。

__instancecheck__私の最初のアイデアは、メタクラス マジックとを使用して、自分のクラスを他のクラスのサブクラスにすることでした__subclasscheck__。ただし、単純な比較の場合は呼び出されません。

誰かが新しいアイデアを持っていますか?

0 投票する
1 に答える
385 参照

delphi - クラス参照(メタクラス)変数からのクラスがTMyClassであるかどうかをテストします

クラス参照から作成されるオブジェクトが特定のクラスのインスタンスなのか、その子孫のインスタンスなのかを知りたいのですが。

つまり、次のようなブール式が必要です。

ただし、varは、クラス参照変数を含む式に置き換えられます。簡単そうに聞こえますが、私は完全に困惑しています。

インスタンスvar:= classRefVar.Createを作成し、テストしてから破棄することもできますが、それは大きなオーバーヘッドです。

奇妙なことに、コンパイラは私に

構文的には同等に見えるが役に立たないことに満足している

明らかに、式

classRefVarがTMyClassの子孫を参照している可能性があるため、これは適切ではありません。

答えを見たら自分を蹴るつもりです...

0 投票する
3 に答える
603 参照

python - さまざまな線形代数バックエンドを提供するためのアーキテクチャ

Pythonで新しいシステムのプロトタイプを作成しています。機能はほとんど数値です。

重要な要件は、個々のユーザー実装からNumpyなどのジェネリックライブラリまで、さまざまな線形代数バックエンドを使用できることです。線形代数の実装(つまり、バックエンド)は、インターフェイスから独立している必要があります。

私の最初のアーキテクチャの試みは次のとおりです。

(1)システムインターフェースを定義する

(2)バックエンドとは独立してそのインターフェースを使用できるようにするコードを実装します

この簡単な例は次のように機能します。Vectorクラスは、バックエンド(numpy.ndarray例では)によって作成されたベクターインスタンスへの参照を保持します。すべての算術呼び出しはインターフェースによって実装されますが、それらの評価はバックエンドに延期されます。

実際には、インターフェイスはすべての適切な演算子をオーバーロードし、バックエンドに依存します(例では__mul__とのみが表示__rmul__されますが、すべての操作で同じことが行われることを確認できます)。

カスタマイズ性と引き換えに、パフォーマンスをいくらか失うことをいとわない。私の例は機能しますが、それは正しく感じられません-非常に多くのコンストラクター呼び出しでバックエンドを壊してしまいます!これは別のmetaclass実装を要求し、より良い呼び出し延期を可能にします。

では、この機能を実装することをどのように推奨しますか?Vectorシステムのすべてのインスタンスを均一に保ち、線形代数のバックエンドから独立させることの重要性を強調する必要があります。

0 投票する
1 に答える
1005 参照

python - django のようなフォームの実装でメタクラスを使用する利点は何ですか?

最初に少し背景を説明します... Django でのフォームの実装を理解するために (そして途中でいくつかの Python を学ぶために)、フォームの Django ソース コードを調べていました。Django は DeclaredMetaFields MetaClassを使用してフォームを実装します。

これは、Django のようなフォーム実装の非常に大雑把なクラス図です ( gist のサンプル コードへのリンク)。

ContactForm の Django フォームのような実装 - クラス図

そして、これがインスタンス図です。

ContactForm の Django フォームのような実装 - インスタンス図

これは、メタクラスに頼らない非常に大まかな同じクラスの実装です ( gist のサンプル コードへのリンク)。

ContactForm の単純で大雑把な実装

メタクラスの概念などを理解し、Django コードがどのように機能するかを理解しています。それでは質問です。

  1. 構文のエレガンスなどの明白な利点以外に、メタクラスの実装に他の利点はありますか?
  2. BoundField のような中間オブジェクトに頼ることなく、メタクラスのような実装は可能ですか?