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