You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承为何改变类签名?以TensorFlow Keras Layer为例

问题原因与解决办法

核心原因

TensorFlow Keras的Layer类通过元类机制和方法包装,改写了所有子类的__init__方法签名。

当你继承Layer时,Keras的元类会在子类定义阶段,将你编写的__init__替换成一个通用包装函数。这个包装函数负责对接Keras内部逻辑(比如权重追踪、模型序列化/反序列化、参数验证等),对外暴露的签名就是(*args, **kwargs),所以inspect.signature读取到的是这个包装后的签名,而非你定义的原始参数。

普通类没有这种框架层面的包装逻辑,inspect可以直接解析到你写的__init__参数,因此显示符合预期。

如何获取子类的原始签名

如果需要获取你定义的__init__的真实签名,可以尝试读取__init__.__wrapped__属性(Keras在包装时会保留原始方法的引用):

import inspect
from tensorflow.keras.layers import Layer

class Class1(Layer):
    def __init__(self, my_arg: int):
        super().__init__()
        self.my_arg = my_arg

# 读取原始__init__的签名
original_sig = inspect.signature(Class1.__init__.__wrapped__)
print(original_sig)  # 输出 (self, my_arg: int)

注意:这个方式依赖Keras的内部实现细节,不同版本可能存在差异,使用前建议测试验证。

补充说明

Keras这么设计是为了统一所有层的初始化接口,方便框架实现统一的参数处理、模型保存与加载(比如从配置重建层时,框架可以自动解析**kwargs中的参数并传递给原始__init__)。

内容的提问来源于stack exchange,提问作者Andrea Allais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:36:07