繁体   English   中英

如何让装饰器在程序启动时生效 - Python

[英]How to make decorators take effect when the program starts - Python

当装饰器应用于其他模块中的方法时,如果我想让这些装饰生效,我需要加载这些模块。

我可以让它们在程序启动时加载吗?

我尝试在main.py中导入所有模块可以实现这个目标,有没有其他方法可以做到这一点?

有点不清楚你想要什么(一个最小的、可重现的例子会很有帮助),但我会试着解释一下装饰器什么以及它们的代码何时运行。 我基本上将总结关于装饰器的优秀 Real Python 文章的部分内容,您绝对应该阅读这篇文章以获得完整的理解。

装饰器只是功能。 真正的 Python 给出了这个例子:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

def say_whee():
    print("Whee!")

say_whee = my_decorator(say_whee)

如果运行它,它会生成以下 output:

>>> say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.

现在你可能认为我没有给你展示一个装饰器,只是一个包装器 function。 你猜怎么着? 一样。 装饰器是我们上面所做的合成糖,事实上:我们可以像装饰器一样使用相同的 function:

@my_decorator
def say_whee():
    print("Whee!")

至于何时运行装饰器,答案是“每当运行装饰的 function 时”。 没有比这更奇妙或更神秘的事情了。 如果你想让你的装饰器运行,你需要运行被装饰的函数。 如果装饰物是 class,则每次实例化 class 的实例时都会运行装饰器,猜猜看,这是通过运行装饰器包装的 function 来实现的。

希望这能把事情弄清楚一点。 同样,我强烈建议阅读链接的 Real Python 文章以获得更完整的理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM