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

Python中super()隐式调用机制及_call函数执行位置解析

理解Python继承类中_call方法的隐式执行机制

我正在学习Python,已经熟悉继承概念,但查看Pixel2Mesh项目代码时遇到困惑:代码里用了继承,却没有显式调用_call函数,但这个函数似乎在用户代码之外被自动执行了。下面是我写的继承示例,希望能搞懂背后的机制。

我的继承示例

class one(object):
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def _call(self):
        return self.a + self.b

class two(one):
    def __init__(self,a,b,c):
        super(two,self).__init__(a,b)
        self.c = c

    def _call_(self):
        print(self.c * self.c)

测试代码:

mt = two(1,2,3)
print(mt._call())

首先得明确:Python原生语法里,_call这类下划线开头的方法不会自动执行,你看到的隐式调用是深度学习框架(比如Pixel2Mesh基于的PyTorch)的设计逻辑,不是Python本身的特性。

核心原因:框架的__call__方法封装

像PyTorch的nn.Module这类基类,会在内部实现__call__方法。当你把继承自Module的实例当作函数调用时(比如model(input_data)),Python会自动触发__call__,而__call__内部会调用自定义的_call(或forward,不同项目可能封装方式不同)方法。这就是你看到_call没被显式调用却执行的原因——框架的基类帮你做了这个调用逻辑。

用你的示例模拟这个机制

如果要在你的代码里实现类似的隐式调用,只需要给父类添加__call__方法,让它触发_call:

修改后的代码:

class one(object):
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def _call(self):
        return self.a + self.b
    
    # 添加__call__,当实例被当作函数调用时自动执行
    def __call__(self):
        return self._call()

class two(one):
    def __init__(self,a,b,c):
        super(two,self).__init__(a,b)
        self.c = c

    # 修正笔误,把_call_改成_call,覆盖父类的_call方法
    def _call(self):
        print(self.c * self.c)
        # 可选:调用父类的_call方法
        return super()._call()

测试时直接调用实例:

mt = two(1,2,3)
result = mt()  # 自动触发__call__,进而调用_call
print(result)

运行后会先打印9,再输出3,和预期逻辑一致。

补充:你示例里的小问题

你写的子类方法是_call_(多了一个下划线),这和父类的_call不是同一个方法,所以调用mt._call()时只会执行父类的逻辑,子类的_call_不会被触发,这是个小笔误,注意修正。

内容的提问来源于stack exchange,提问作者shayan Hojati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:20:43