PyTorch中定义在__init__后的make_gen_block为何可在__init__内调用
调用生效的核心原因
- 首先要明确Python类的两个阶段的执行逻辑:类定义阶段和实例化阶段的执行时机完全分离
- 类定义阶段:Python会从上到下依次执行类体内的顶层代码,遇到
def关键字时,只会把对应的函数对象绑定为类的属性,不会执行函数内部的代码。也就是说__init__、make_gen_block这些方法的内部逻辑,在类定义阶段完全不会运行,只是把这些方法存到了Generator类的属性空间里。 - 实例化阶段:只有当你执行
Generator()创建类的实例时,才会触发__init__方法的内部代码运行。这个时候整个Generator类已经完成了全部定义,写在__init__后面的make_gen_block方法早就已经绑定到类上了,实例self自然可以正常访问到这个方法。
- 类定义阶段:Python会从上到下依次执行类体内的顶层代码,遇到
- 你之前的误解是把「方法的定义顺序」和「方法内部代码的执行顺序」搞混了:如果是类定义阶段就需要直接执行的代码(比如直接在类顶层写调用方法的代码),才要求被调用的方法定义在前面;而
__init__是实例化阶段才执行的逻辑,不受类内部方法定义顺序的影响。
反例(会报错的写法):
class Test: # 类顶层直接执行调用,属于类定义阶段的代码,此时func还没定义,会报错 a = func(1) def __init__(self): pass def func(self, x): return x
内容的提问来源于stack exchange,提问作者MoBo
相关产品推荐
相关产品推荐

