class_docstr: A custom data type, to be paired with an ExtensionArray.
  
  See Also
  --------
  extensions.register_extension_dtype: Register an ExtensionType
      with pandas as class decorator.
  extensions.ExtensionArray: Abstract base class for custom 1-D array types.
  
  Notes
  -----
  The interface includes the following abstract methods that must
  be implemented by subclasses:
  
  * type
  * name
  * construct_array_type
  
  The following attributes and methods influence the behavior of the dtype in
  pandas operations
  
  * _is_numeric
  * _is_boolean
  * _get_common_dtype
  
  The `na_value` class attribute can be used to set the default NA value
  for this type. :attr:`numpy.nan` is used by default.
  
  ExtensionDtypes are required to be hashable. The base class provides
  a default implementation, which relies on the ``_metadata`` class
  attribute. ``_metadata`` should be a tuple containing the strings
  that define your data type. For example, with ``PeriodDtype`` that's
  the ``freq`` attribute.
  
  **If you have a parametrized dtype you should set the ``_metadata``
  class property**.
  
  Ideally, the attributes in ``_metadata`` will match the
  parameters to your ``ExtensionDtype.__init__`` (if any). If any of
  the attributes in ``_metadata`` don't implement the standard
  ``__eq__`` or ``__hash__``, the default implementations here will not
  work.
  
  Examples
  --------
  
  For interaction with Apache Arrow (pyarrow), a ``__from_arrow__`` method
  can be implemented: this method receives a pyarrow Array or ChunkedArray
  as only argument and is expected to return the appropriate pandas
  ExtensionArray for this dtype and the passed values:
  
  >>> import pyarrow
  >>> from pandas.api.extensions import ExtensionArray
  >>> class ExtensionDtype:
  ...     def __from_arrow__(
  ...         self,
  ...         array: pyarrow.Array | pyarrow.ChunkedArray
  ...     ) -> ExtensionArray:
  ...         ...
  
  This class does not inherit from 'abc.ABCMeta' for performance reasons.
  Methods and properties required by the interface raise
  ``pandas.errors.AbstractMethodError`` and no ``register`` method is
  provided for registering virtual subclasses.
class_docstr_tok: ["A","custom","data","type",",","to","be","paired","with","an","ExtensionArray",".","See","Also","--","--","--","--","extensions.register_extension_dtype",":","Register","an","ExtensionType","with","pandas","as","class","decorator",".","extensions.ExtensionArray",":","Abstract","base","class","for","custom","1-D","array","types",".","Notes","--","--","-","The","interface","includes","the","following","abstract","methods","that","must","be","implemented","by","subclasses",":","*","type","*","name","*","construct_array_type","The","following","attributes","and","methods","influence","the","behavior","of","the","dtype","in","pandas","operations","*","_is_numeric","*","_is_boolean","*","_get_common_dtype","The","`","na_value","`","class","attribute","can","be","used","to","set","the","default","NA","value","for","this","type",".",":","attr",":","`","numpy.nan","`","is","used","by","default",".","ExtensionDtypes","are","required","to","be","hashable",".","The","base","class","provides","a","default","implementation",",","which","relies","on","the","``","_metadata","``","class","attribute",".","``","_metadata","``","should","be","a","tuple","containing","the","strings","that","define","your","data","type",".","For","example",",","with","``","PeriodDtype","``","that's","the","``","freq","``","attribute",".","*","*","If","you","have","a","parametrized","dtype","you","should","set","the","``","_metadata","``","class","property","*","*",".","Ideally",",","the","attributes","in","``","_metadata","``","will","match","the","parameters","to","your","``","ExtensionDtype.__init__","``","(","if","any",")",".","If","any","of","the","attributes","in","``","_metadata","``","do","n't","implement","the","standard","``","__eq__","``","or","``","__hash__","``",",","the","default","implementations","here","will","not","work",".","Examples","--","--","--","--","For","interaction","with","Apache","Arrow","(","pyarrow",")",",","a","``","__from_arrow__","``","method","can","be","implemented",":","this","method","receives","a","pyarrow","Array","or","ChunkedArray","as","only","argument","and","is","expected","to","return","the","appropriate","pandas","ExtensionArray","for","this","dtype","and","the","passed","values",":",">",">",">","import","pyarrow",">",">",">","from","pandas.api.extensions","import","ExtensionArray",">",">",">","class","ExtensionDtype",":","...","def","__from_arrow__","(","...","self",",","...","array",":","pyarrow.Array","|","pyarrow.ChunkedArray","...",")","-",">","ExtensionArray",":","...","...","This","class","does","not","inherit","from","'abc.ABCMeta","'","for","performance","reasons",".","Methods","and","properties","required","by","the","interface","raise","``","pandas.errors.AbstractMethodError","``","and","no","``","register","``","method","is","provided","for","registering","virtual","subclasses","."]
docstr: Return the common dtype, if one exists.
  
  Used in `find_common_type` implementation. This is for example used
  to determine the resulting dtype in a concat operation.
  
  If no common dtype exists, return None (which gives the other dtypes
  the chance to determine a common dtype). If all dtypes in the list
  return None, then the common dtype will be "object" dtype (this means
  it is never needed to return "object" dtype from this method itself).
  
  Parameters
  ----------
  dtypes : list of dtypes
      The dtypes for which to determine a common dtype. This is a list
      of np.dtype or ExtensionDtype instances.
  
  Returns
  -------
  Common dtype (np.dtype or ExtensionDtype) or None
docstr_tok: ["Return","the","common","dtype",",","if","one","exists",".","Used","in","`","find_common_type","`","implementation",".","This","is","for","example","used","to","determine","the","resulting","dtype","in","a","concat","operation",".","If","no","common","dtype","exists",",","return","None","(","which","gives","the","other","dtypes","the","chance","to","determine","a","common","dtype",")",".","If","all","dtypes","in","the","list","return","None",",","then","the","common","dtype","will","be","``","object","''","dtype","(","this","means","it","is","never","needed","to","return","``","object","''","dtype","from","this","method","itself",")",".","Parameters","--","--","--","--","--","dtypes",":","list","of","dtypes","The","dtypes","for","which","to","determine","a","common","dtype",".","This","is","a","list","of","np.dtype","or","ExtensionDtype","instances",".","Returns","--","--","--","-","Common","dtype","(","np.dtype","or","ExtensionDtype",")","or","None"]
code: def _get_common_dtype(
      self, dtypes: list[DtypeObj]
  ) -> DtypeObj | None:
      """
      Return the common dtype, if one exists.
  
      Used in `find_common_type` implementation. This is for example used
      to determine the resulting dtype in a concat operation.
  
      If no common dtype exists, return None (which gives the other dtypes
      the chance to determine a common dtype). If all dtypes in the list
      return None, then the common dtype will be "object" dtype (this means
      it is never needed to return "object" dtype from this method itself).
  
      Parameters
      ----------
      dtypes : list of dtypes
          The dtypes for which to determine a common dtype. This is a list
          of np.dtype or ExtensionDtype instances.
  
      Returns
      -------
      Common dtype (np.dtype or ExtensionDtype) or None
      """
      if len(set(dtypes)) == 1:
          # only itself
          return self
      else:
          return None
  
imports: from __future__ import annotations
  from typing import TYPE_CHECKING, Any, TypeVar, cast, overload
  import numpy
  from pandas._libs import missing
  from pandas._libs.hashtable import object_hash
  from pandas._libs.properties import cache_readonly
  from pandas.errors import AbstractMethodError
  from pandas.core.dtypes.generic import ABCDataFrame, ABCIndex, ABCSeries
label_desc: Use image node_id 16 for calling the ExtensionDtype obj's underlying member method code with example usage: obj._get_common_dtype(dtypes) and returns: self, None