class_docstr: A specification of executor class.
  
  Attributes:
    executor_class: a subclass of base_executor.BaseExecutor used to execute
      this component (required).
    extra_flags: extra flags to be set in the Python base executor.
class_docstr_tok: ["A","specification","of","executor","class",".","Attributes",":","executor_class",":","a","subclass","of","base_executor.BaseExecutor","used","to","execute","this","component","(","required",")",".","extra_flags",":","extra","flags","to","be","set","in","the","Python","base","executor","."]
code: def copy(self) -> "ExecutorClassSpec":
      # The __reduce__() method is customized and the function
      # import_class_by_path() is used in it. import_class_by_path() doesn't work
      # with nested class which is very common in tests. copy.deepcopy(self)
      # desn't work.
      # So in this implementation, a new
      # ExecutorClassSpec is created and every field in the old instance is
      # deepcopied to the new instance.
      cls = self.__class__
      result = cls.__new__(cls)
      for k, v in self.__dict__.items():
          setattr(result, k, copy.deepcopy(v))
      return result
  
imports: import copy
  from typing import cast, Iterable, List, Optional, Type, Union
  from tfx import types
  from tfx.dsl.components.base import base_executor
  from tfx.dsl.placeholder import placeholder
  from tfx.proto.orchestration import executable_spec_pb2
  from tfx.proto.orchestration import placeholder_pb2
  from tfx.utils import import_utils
  from tfx.utils import json_utils
  from tfx.utils import name_utils
  from google.protobuf import message
label_desc: Use image node_id 8 for calling the ExecutorClassSpec obj's underlying member method code with example usage: obj.copy() and returns: result