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 属性实际上由两部分组成:熟悉的“属性”部分,例如
Int
、String
等,以及相关的 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