class_docstr: Contains methods meant to be executed by a data owner.
  
  Args:
    player_name: `str`, name of the `tfe.player.Player`
                 representing the data owner
    model_name: `str`, name of the model to be trained
    data_name: `str`, name of dataset that model trained on
    data_slice: specify which part of this dataset to use
code: def _build_gradient_func(self):
      @tfe.local_computation(player_name=self.player.name)
      def compute_gradient():
          with tf.name_scope("local_training"):
              with tf.GradientTape() as tape:
                  x, y = next(self.data_iter)
                  y_pred = self.model.call(x)
                  loss = self.loss(y, y_pred)
              gradients = tape.gradient(
                  loss, self.model.trainable_variables
              )
  
          return gradients
  
      self.gradient_func = compute_gradient
  
imports: import argparse
  import sys
  import tensorflow
  import tf_encrypted
  from tf_encrypted.keras.datasets import *
  from tf_encrypted.protocol import ABY3
  from tf_encrypted.protocol import Pond
  from tf_encrypted.protocol import SecureNN
label_desc: Use image node_id 4 for calling the DataOwner obj's underlying member method code with example usage: obj._build_gradient_func() and returns: gradients