我最近在和一些人谈论我正在编写的程序时听到了“hook”这个词。我不确定这个术语到底意味着什么,尽管我从对话中推断钩子是一种函数类型。我寻找一个定义,但无法找到一个好的答案。有没有人能告诉我这个术语的一般含义,或者举个小例子来说明这个定义?


当前回答

钩子是一类允许基本代码调用扩展代码的函数。这在核心开发人员希望在不暴露代码的情况下提供可扩展性的情况下非常有用。

钩子的一个用法是在电子游戏mod开发中。游戏可能不允许mod开发者扩展基本功能,但核心mod库开发者可以添加钩子。有了这些钩子,独立开发者可以在任何想要的事件中调用他们的自定义代码,比如游戏加载、库存更新、实体交互等。

一种常见的实现方法是给函数一个空的回调列表,然后公开扩展回调列表的能力。基本代码将始终在相同的适当时间调用该函数,但如果是空回调列表,则该函数不执行任何操作。这是有意为之。

然后,第三方就有机会编写额外的代码,并将他们的新回调添加到钩子的回调列表中。仅仅通过一个可用钩子的引用,它们就以最小的风险扩展了基本系统的功能。

hook不允许开发人员做任何其他结构和接口不能做的事情。它们是需要考虑任务和用户(第三方开发人员)的选择。

澄清一下:钩子允许扩展,并且可以使用回调来实现。回调函数通常只是一个函数指针;函数的计算地址。其他答案/评论似乎有些混乱。

其他回答

答案很多,但没有例子,所以添加一个虚拟的:下面的complated_func提供了两个钩子来修改它的行为

from typing import List, Callable


def complicated_func(
    lst: List[int], hook_modify_element: Callable[[int], int], hook_if_negative=None
) -> int:
    res = sum(hook_modify_element(x) for x in lst)
    if res < 0 and hook_if_negative is not None:
        print("Returning negative hook")
        return hook_if_negative
    return res


def my_hook_func(x: int) -> int:
    return x * 2


if __name__ == "__main__":
    res = complicated_func(
        lst=[1, 2, -10, 4],
        hook_modify_element=my_hook_func,
        hook_if_negative=0,
    )
    print(res)

从本质上讲,它是代码中的一个地方,允许您进入一个模块来提供不同的行为或在发生某事时做出反应。

编程中的钩子是一种技术,它使用所谓的钩子来创建一个过程链作为事件处理程序。

简而言之,您可以更改API调用的代码,例如MessageBox,使其执行由您编辑的不同函数(全局适用于系统范围,本地适用于进程范围)。

Hook表示在代码中分派某个类型的事件的位置,如果该事件在此之前已使用适当的函数进行回调,那么它将由这个已注册的函数处理,否则什么都不会发生。