title: Difference between 'ctx' and 'self' in python?
body: <p>While using the deep learning library PyTorch I came across definitions like this. Does <code>ctx</code> have the same behavior as <code>self</code>? </p>
  
  <pre><code>class LinearFunction(Function):
  
      @staticmethod
      def forward(ctx, input, weight, bias=None):
          ctx.save_for_backward(input, weight, bias)
          output = input.mm(weight.t())
          if bias is not None:
              output += bias.unsqueeze(0).expand_as(output)
          return output
  
      @staticmethod
      def backward(ctx, grad_output):
          input, weight, bias = ctx.saved_variables
          grad_input = grad_weight = grad_bias = None
          if ctx.needs_input_grad[0]:
              grad_input = grad_output.mm(weight)
          if ctx.needs_input_grad[1]:
              grad_weight = grad_output.t().mm(input)
          if bias is not None and ctx.needs_input_grad[2]:
              grad_bias = grad_output.sum(0).squeeze(0)
  
          return grad_input, grad_weight, grad_bias
  </code></pre>