我有许多类,我希望在其上运行装饰器功能。正如我所知,装饰器只在类/函数/它们标记的任何东西被加载到代码中时才会运行。
e.g。
def decorator(cls):
print("Decorator executed")
return cls
@decorator
class Example:
pass
Example()
如何触发装饰器在启动 django应用程序 时标记的所有类上的装饰器功能,而无需单独加载每个类? (或者不知道装饰者标记的类)
答案 0 :(得分:0)
解决方案更新:
我有一堆类,我想在其上运行一个装饰器函数,它们的类名都包含'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)