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
相关产品推荐
相关产品推荐

