Here is part of code from mmcv (mmcv/runner/base_module.py).
I don't understand how does self(**data) works.
class BaseDetector(BaseModule, metaclass=ABCMeta):
"""Base class for detectors."""
# ...
def train_step(self, data, optimizer):
losses = self(**data)
loss, log_vars = self._parse_losses(losses)
outputs = dict(
loss=loss, log_vars=log_vars, num_samples=len(data['img_metas']))
return outputs
class BaseModule(nn.Module, metaclass=ABCMeta):
def __init__(self, init_cfg: Optional[dict] = None):
# ...
Tried to find some function like __call__ in the parent class, but it seems not the right direction to go.
Could any one explain why self could be used as a function?