问题描述
transforms.RandomCrop类里没有__call__函数,为什么可以调用sun_object(x)语句?【sun_object表示子类实例化的对象】
问题解答
transforms.RandomCrop类里并没有__call__函数,但是其继承torch.nn.Module,父类Module中有__call__方法,因此sun_object(x)这条语句可以正常执行。
# torch/nn/modules/module.py
......
class Module:
......
def _call_impl(self, *input, **kwargs):
......
__call__ : Callable[…, Any] = _call_impl
......
但是Module类中并没有直接给出__call__的实现体,而是__call__后紧跟冒号,此冒号表示类型注解;后面的Callable和Any是typing模块中的,Callable表示可调用类型,即等号右边应该是一个可调用类型,此处指的是_call_impl;Any是一种特殊的类型,它与所有类型兼容;Callable[…, Any]表示_call_impl可接受任意数量的参数并返回Any。这里__call__实际指向了_call_impl函数,因此调用__call__实际是调用_call_impl。
参考
1.PyTorch中nn.Module类中__call__方法介绍_fengbingchun的博客-程序员秘密__call_impl
2.探究PyTorch中model(image)会自动调用forward函数?