私はsetup_all()
と呼んだとき、私がモデルで宣言したすべてのエンティティクラスをelixir \ sqlalchemyがどのように知っているのですか?私は、私の小さなプロジェクトでこのような機能が必要ですが、私は手がかりがありません。私はエリクシルのsetup_all()
を通してsteptraceしようとしましたが、すべてのエンティティクラスのコレクションを "グローバル"リスト(またはdictですか?)で保持していましたが、リストがいっぱいになった瞬間を捕まえられません。何か案は?特定の基本クラスの子孫であるすべてのクラス宣言を反復処理する方法はありますか?
4
A
答えて
4
SQLALchemyやelixirを全く使用していない主な質問に答える - はい、Pythonでも可能です。
標準ライブラリのガベージコープレクタ(gc
)モジュールには、与えられたオブジェクト、インタープリタワイドへの参照をすべて取得できるようにする関数呼び出しがあります。クラスは、継承されたクラスの__mro__
属性で常に参照されます。
ので、次の関数は、与えられたクラスを継承するすべてのクラス取得できます。クラスの定義について
import gc
def find_subclasses(cls):
all_refs = gc.get_referrers(cls)
results = []
for obj in all_refs:
# __mro__ attributes are tuples
# and if a tuple is found here, the given class is one of its members
if (isinstance(obj, tuple) and
# check if the found tuple is the __mro__ attribute of a class
getattr(obj[0], "__mro__", None) is obj):
results.append(obj[0])
return results
9
を、これは簡単です(なしインポート)
def find_subclasses(cls):
results = []
for sc in cls.__subclasses__():
results.append(sc)
return results
私はわかりませんあなたがこれを望んでいれば、またはオブジェクト。オブジェクトが必要な場合:
import gc
def find_subclasses(cls):
results = []
for sc in cls.__subclasses__():
for obj in gc.get_objects():
if isinstance(obj, sc):
results.append(obj)
return results
関連する問題
- 1. 派生クラスの型である抽象基本クラスのメンバーを宣言する方法はありますか?
- 2. Dymolaのクラスのすべてのインスタンスを反復処理する方法は?
- 3. すべての関数を基本クラスに仮想宣言する必要がありますか?
- 4. 基本クラスのクラスプロシージャは、子孫のオブジェクトをインスタンス化する必要がありますか?
- 5. TypeScriptの継承 - "クラスは基本クラスの後に宣言する必要があります"
- 6. 特定の値の属性を持つActiveRecordモデルオブジェクトを反復処理する方法はありますか?
- 7. jQueryでクラスを反復処理する方法は?
- 8. Javaの特定のクラスのすべてのオブジェクトを反復処理できますか?
- 9. Id divに特定のクラスの孫があります
- 10. ツリー内のインスタンスを反復処理する方法はありますか?
- 11. テンプレート友人クラスを宣言する2つの方法はありますか?
- 12. 既存のすべてのグループを自動的に反復処理する方法はありますか?
- 13. Android上でPathオブジェクトを反復処理する方法はありますか?
- 14. Handlebars.jsで地図を反復処理する方法はありますか?
- 15. 基本クラスでより一般的なメソッドがある場合、基本クラスのメソッドをオーバーライドする方法は?
- 16. 特性オブジェクトの参照の反復子として構造体のコレクションを反復処理する方法はありますか?
- 17. すべてのContentresolverエントリを反復処理する方法は?
- 18. XPath:すべてのテキストノードを反復処理する方法は?
- 19. クラスのすべてのインスタンスを反復処理して関数で使用する方法はありますか?
- 20. Dapper DynamicParametersオブジェクトを反復処理する方法はありますか?
- 21. BigIntegerを反復処理に使用する方法はありますか?
- 22. クラスが別のクラスの子孫であるかどうかを調べる方法
- 23. C++でtypedefクラスをあらかじめ宣言する方法
- 24. クラス処理、反復コード
- 25. XmlSerializerの使用中に派生クラスの基本クラスのプロパティを無視する方法はありますか
- 26. ジェネリックプログラミングで派生クラスの基本クラスメンバ関数を再宣言する必要があります
- 27. 基本クラスで静的メソッドを宣言する必要があるのはいつですか?
- 28. SimpleXMLElementオブジェクトであるXML値を反復処理する方法
- 29. 入れ子になったオブジェクトを反復処理し、jsx内でレンダリングする方法はありますか?
- 30. 子クラスが特定の内部クラスを宣言するようにする方法
素晴らしい!ありがとう、それは完全に動作します! – AlexVhr