跳到主要内容

hook_classmethod

函数私有源码

hooked_method: Callable[P, T] = hook_classmethod[**P, _Type, T](
cls_method: Callable[P, T],
hook_before: Callable[Concatenate[_Type, P], None] | None = None,
hook_after: Callable[Concatenate[_Type, P], None] | None = None,
)

针对类方法的钩子。

参数

输入

参数类型必选
说明
cls_method(**P) -> T要钩入的类方法。该类方法是已经绑定后的版本,其中第一个参数cls已经隐含,且不存在于spec P中。
hook_beforeNone | ((_Type, **P) -> None)在调用该类方法之前,要运行的钩子。
hook_afterNone | ((_Type, **P) -> None)在调用该类方法之后,要运行的钩子。

输出

参数类型
说明
hooked_method(**P) -> T添加了钩子后的类方法,其中第一个参数(类本身)是隐含的。

范例

钩入一个已经定义__init_subclass__的方法

hook_init_subclass.py
import flask_sqlalchemy_compat as fsc


class ExampleBase:
test_val = 0

def __init_subclass__(cls) -> None:
cls.test_val = 1


class ExampleA(ExampleBase):
pass


def hook(cls: ExampleBase) -> None:
cls.test_val = 10


ExampleBase.__init_subclass__ = fsc.utilities.hook_classmethod(
ExampleBase.__init_subclass__, hook_after=hook
)


class ExampleB(ExampleBase):
pass


if __name__ == "__main__":
print("ExampleBase.test_val:", ExampleBase.test_val)
print("ExampleA.test_val:", ExampleA.test_val)
print("ExampleB.test_val:", ExampleB.test_val)