code: def register(
      cls,
      op_cls: OperandType,
      func: Callable[[TileableData], Set[Any]],
      replace: bool = False,
  ) -> None:
      if op_cls not in cls._OP_TO_SELECT_FUNCTION or replace:
          cls._OP_TO_SELECT_FUNCTION[op_cls] = func
      else:
          raise ValueError(f"key {op_cls} exists.")
  
file_path: mars/mars/optimization/logical/tileable/column_pruning/self_column_selector.py
imports: from typing import Set, Any, Callable
  from .utils import get_cols_exclude_index
  from .....core import TileableData
  from .....dataframe.core import BaseDataFrameData, BaseSeriesData
  from .....dataframe.groupby.aggregation import DataFrameGroupByAgg
  from .....dataframe.indexing.getitem import DataFrameIndex
  from .....dataframe.indexing.setitem import DataFrameSetitem
  from .....dataframe.merge import DataFrameMerge
  from .....typing import OperandType
label_desc: Use image node_id 1 for calling the SelfColumnSelector obj's underlying member method code with example usage: obj.register(cls, op_cls, func, replace) without return types