class_docstr: A base class for Bokeh properties with simple get/set and serialization
  behavior.
class_docstr_tok: ["A","base","class","for","Bokeh","properties","with","simple","get\/set","and","serialization","behavior","."]
docstr: Implement the getter for the Python `descriptor protocol`_.
  
  For instance attribute access, we delegate to the |Property|. For
  class attribute access, we return ourself.
  
  Args:
      obj (HasProps or None) :
          The instance to set a new property value on (for instance
          attribute access), or None (for class attribute access)
  
      owner (obj) :
          The new value to set the property to
  
  Returns:
      None
  
  Examples:
  
      .. code-block:: python
  
          >>> from bokeh.models import Range1d
  
          >>> r = Range1d(start=10, end=20)
  
          # instance attribute access, returns the property value
          >>> r.start
          10
  
          # class attribute access, returns the property descriptor
          >>> Range1d.start
          <bokeh.core.property.descriptors.PropertyDescriptor at 0x1148b3390>
code: def __get__(
      self, obj: HasProps | None, owner: type[HasProps] | None
  ) -> T:
      """Implement the getter for the Python `descriptor protocol`_.
  
      For instance attribute access, we delegate to the |Property|. For
      class attribute access, we return ourself.
  
      Args:
          obj (HasProps or None) :
              The instance to set a new property value on (for instance
              attribute access), or None (for class attribute access)
  
          owner (obj) :
              The new value to set the property to
  
      Returns:
          None
  
      Examples:
  
          .. code-block:: python
  
              >>> from bokeh.models import Range1d
  
              >>> r = Range1d(start=10, end=20)
  
              # instance attribute access, returns the property value
              >>> r.start
              10
  
              # class attribute access, returns the property descriptor
              >>> Range1d.start
              <bokeh.core.property.descriptors.PropertyDescriptor at 0x1148b3390>
  
      """
      if obj is not None:
          value = self._get(obj)
          if value is Undefined:
              raise UnsetValueError(
                  f"{obj}.{self.name} doesn't have a value set"
              )
          return value
  
      elif owner is not None:
          return self
  
      # This should really never happen. If it does, __get__ was called in a bad way.
      raise ValueError(
          "both 'obj' and 'owner' are None, don't know what to do"
      )
  
imports: from __future__ import annotations
  import logging
  from copy import copy
  from types import FunctionType
  from typing import TYPE_CHECKING, Any, Callable, Generic, TypeVar
  from ...util.deprecation import deprecated
  from .singletons import Undefined
  from .wrappers import PropertyValueColumnData, PropertyValueContainer
label_desc: Use image node_id 3 for calling the PropertyDescriptor obj's underlying member method code with example usage: obj.__get__(obj, owner) and returns: value, self