class_docstr: An implementation of the dataframe interchange protocol.
  Based on https://github.com/ibis-project/ibis/pull/6733
  
  This is a thin shim around the pyarrow implementation to allow for:
   - Accessing a few of the metadata queries without executing the expression.
   - Caching the execution on the dataframe object to avoid re-execution if
     multiple methods are accessed.
  
   The dataframe interchange protocol may be found here:
   https://data-apis.org/dataframe-protocol/latest/API.html
class_docstr_tok: ["An","implementation","of","the","dataframe","interchange","protocol",".","Based","on","https",":","\/\/github.com\/ibis-project\/ibis\/pull\/6733","This","is","a","thin","shim","around","the","pyarrow","implementation","to","allow","for",":","-","Accessing","a","few","of","the","metadata","queries","without","executing","the","expression",".","-","Caching","the","execution","on","the","dataframe","object","to","avoid","re-execution","if","multiple","methods","are","accessed",".","The","dataframe","interchange","protocol","may","be","found","here",":","https",":","\/\/data-apis.org\/dataframe-protocol\/latest\/API.html"]
code: def num_columns(self):
      return len(self._schema.names)
  
imports: import pyarrow
  from functools import cached_property
  from typing import Sequence, Optional
  from .sql import SqlDataset
label_desc: Use image node_id 6 for calling the SqlDatasetDataFrame obj's underlying member method code with example usage: obj.num_columns() and returns: len