デコレータ関数を実行したいクラスがいくつかあります。私が知っているように、デコレータは、クラス/関数/それらがラベル付けするものがコードにロードされたときにのみ実行されます。
例えば
def decorator(cls):
print("Decorator executed")
return cls
@decorator
class Example:
pass
Example()
各クラスを個別にロードせずに、djangoアプリケーションの起動時にデコレータがラベル付けするすべてのクラスでデコレータ関数をトリガーするにはどうすればよいですか?(またはデコレータがラベル付けするクラスの知識がない場合)
ソリューションの更新:
デコレータ関数を実行したいクラスがたくさんあり、それらはすべてクラス名に「Model」が含まれていました。クラスのデコレータは、指定されたクラスのインポート時に実行されるため、回避策として、クラス名に「Model」を含むすべてのクラスをインポートする関数(起動時に実行)を作成し、副産物としてデコレータ関数をこれらすべてに対して実行しましたクラス。
import glob
import importlib.util
def execute_decorator_against_classes():
for filename in glob.iglob("**/*Model.py",
recursive=True):
module_name = filename.split("/")
module_name = module_name[len(module_name) - 1]
module_name = module_name[:module_name.rfind('.py')]
spec = importlib.util.spec_from_file_location(module_name,
filename)
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加