bokeh.core.property.descriptor_factory#

为所有 Bokeh 属性提供一个基类。

Bokeh 属性通过向 HasProps 类贡献 Python 描述符对象来工作。然后,这些描述符将属性访问委托回 Bokeh 属性类,该类处理验证、序列化和文档需求。

PropertyDescriptorFactory 类提供 make_descriptors 方法,该方法由元类 MetaHasProps 在类创建期间使用,以安装与声明的属性相对应的描述符。

这种机制有助于使 Bokeh 更人性化。例如,DataSpec 属性在固定值和对列数据源列的引用之间进行调解。用户可以使用非常简单的语法,并且该属性将自动正确地序列化和验证

from bokeh.models import Circle

c = Circle()

c.x = 10      # serializes to {'value': 10}

c.x = 'foo'   # serializes to {'field': 'foo'}

c.x = [1,2,3] # raises a ValueError validation exception

在 Bokeh 中还有许多其他类似的例子。通过这种方式,用户可以简单自然地操作,而不必关心验证、序列化和文档周围的底层细节。

注意

这些类构成了实现 Bokeh 模型和属性系统的非常底层的机制的一部分。这些类或其方法不太可能适用于任何标准用法或任何未直接开发 Bokeh 自身基础设施的人员。

class PropertyDescriptorFactory[source]#

所有 Bokeh 属性的基类。

Bokeh 属性实际上由两部分组成:熟悉的“属性”部分,例如 IntString 等,以及相关的 Python 描述符,该描述符将属性访问(例如 range.start)委托给属性实例。

考虑以下类定义

from bokeh.model import Model
from bokeh.core.properties import Int

class SomeModel(Model):
    foo = Int(default=10)

然后我们可以观察到以下内容

>>> m = SomeModel()

# The class itself has had a descriptor for 'foo' installed
>>> getattr(SomeModel, 'foo')
<bokeh.core.property.descriptors.PropertyDescriptor at 0x1065ffb38>

# which is used when 'foo' is accessed on instances
>>> m.foo
10
make_descriptors(name: str) list[PropertyDescriptor[T]][source]#

返回要安装在类上的 PropertyDescriptor 实例列表,以便将属性访问委托给此属性。

参数:

name (str) – 这些描述符所属的属性的名称

返回:

list[PropertyDescriptor]

返回的描述符由 MetaHasProps 元类收集,并在类创建期间添加到 HasProps 子类中。

PropertyDescriptorFactory 的子类负责实现此函数以返回特定于其需求的描述符。