为委托给Bokeh属性提供Python描述符。
Python descriptor protocol 允许对实例上的所有属性访问进行细粒度控制(“您控制点”)。Bokeh使用描述符协议提供易于使用的、声明性的、基于类型的类属性,这些属性可以自动验证和序列化它们的值,并帮助提供复杂的文档。
Bokeh属性实际上由两部分组成:一个熟悉的“属性”部分,例如 Int , String ,以及相关联的Python描述符,该描述符将属性访问委托给属性实例。
Int
String
例如,范围类对象的一个非常简化的定义可能是:
from bokeh.model import Model from bokeh.core.properties import Float class Range(Model): start = Float(help="start point") end = Float(help="end point")
创建此类时 MetaHasProps 元类连接了两个 start 和 end 属性 Float 财产。然后,当用户访问这些属性时,描述符将所有get和set操作委托给 Float 财产。
MetaHasProps
start
end
Float
rng = Range() # The descriptor __set__ method delegates to Float, which can validate # the value 10.3 as a valid floating point value rng.start = 10.3 # But can raise a validation exception if an attempt to set to a list # is made rng.end = [1,2,3] # ValueError !
更复杂的属性,如 DataSpec 它的子类可以控制如何序列化值。考虑这个例子 Circle 字形及其 x 属性是 NumberSpec :
DataSpec
Circle
x
NumberSpec
from bokeh.models import Circle c = Circle() c.x = 10 # serializes to {'value': 10} c.x = 'foo' # serializes to {'field': 'foo'}
在博基还有很多类似的例子。通过这种方式,用户可以简单而自然地进行操作,而不必关心有关验证、序列化和文档的低级细节。
本模块提供 PropertyDescriptor 以及可用于将Bokeh属性附加到Bokeh模型的各种子类。
PropertyDescriptor
注解
这些类构成实现Bokeh模型和属性系统的非常低级的机制的一部分。任何人都不可能直接使用这些基础设施来开发他们的任何类。
BasicPropertyDescriptor
A PropertyDescriptor 对于基本的Bokeh特性(例如, Int , String , Float ,等等)具有简单的get/set和序列化行为。
__init__
为基本Bokeh属性创建PropertyDescriptor。
name (str) -- 此属性用于的属性名称
property (Property) -- 要为其创建描述符的基本属性
__str__
基本字符串表示 BasicPropertyDescriptor .
委托给 self.property.__str__
self.property.__str__
__get__
实现Python的getter descriptor protocol .
例如属性访问,我们将委托给 Property . 对于类属性访问,我们返回self。
Property
obj (HasProps or None) -- 要在其上设置新属性值的实例(例如实例属性访问),或无(用于类属性访问)
owner (obj) -- 要将属性设置为的新值
没有
实际案例
>>> 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.BasicPropertyDescriptor at 0x1148b3390>
__set__
为Python实现setter descriptor protocol .
可选的论点 setter 已添加到标准制定器参数中。当需要时,应该通过显式调用 __set__ . 详见下文。
setter
obj (HasProps) -- 要对其设置新属性值的实例
value (obj) -- 要将属性设置为的新值
setter (ClientSession or ServerSession or None, optional) -- 这是用来防止“飞镖”更新到博克应用程序。(默认值:无)在Bokeh服务器应用程序的上下文中,对属性的传入更新将使用正在进行更新的会话进行注释。此值通过更新触发的任何后续更改通知传播。会话可以将事件设置程序与其自身进行比较,并禁止任何源自自身的更新。
__delete__
实现Python的deleter descriptor protocol .
obj (HasProps) -- 要从中删除此属性的实例
class_default
获取特定子类型的默认值 HasProps ,它不能用于单个实例。
HasProps
cls (class) -- 要获取其默认值的类。
对象
instance_default
获取将用于特定实例的默认值。
obj (HasProps) -- 要获取其默认值的实例。
set_from_json
从JSON值设置此属性的值。
先用这个方法
obj (HasProps) --
json (JSON-dict) --
models (seq[Model], optional) --
trigger_if_changed
如果属性设置为不等于的值,则发送更改事件通知 old .
old
obj (HasProps) -- 正在设置属性的对象。
old (obj) -- 要比较的属性的上一个值
has_ref
另一个属性是否可以引用 HasProps 实例。
委托给基本属性 has_ref 属性 Property .
readonly
此属性是否为只读。
只读属性只能由客户端(即浏览器中的BokehJS)修改。
serialized
序列化对象时是否应序列化属性。
例如,对于“虚拟”或“便利”属性,如果该属性复制了其他属性中已有的信息,则该属性将为False。
ColumnDataPropertyDescriptor
A PropertyDescriptor 专门处理 ColumnData 性质。
ColumnData
此方法首先分别提取和移除任何 units 字段,并直接设置关联的units属性。剩余的值随后传递给超类 __set__ 待处理。
units
DataSpecPropertyDescriptor
A PropertyDescriptor 为了博克 DataSpec 序列化到字段/值字典的属性。
serializable_value
python描述符的基类,它将对命名属性的访问委托给Bokeh Property 实例。
创建一个描述符,用于将命名的Bokeh属性作为 HasProps 班级。
name (str) -- 此描述符用于的属性名
基本字符串表示 PropertyDescriptor .
子类必须实现这一点以满足它们的特定需求。
NotImplementedError --
add_prop_descriptor_to_class
MetaHasProps 在类创建期间调用此函数,因为它迭代要添加的属性,以更新其新属性的注册表。
传入的参数是可变的,此函数将相应地更新它们。
class_name (str) -- 添加此描述符的类的名称
new_class_attrs (dict[str, PropertyDescriptor]) -- 将属性名映射到此函数将更新的PropertyDescriptor
names_with_refs (set[str]) -- 此函数将更新的还具有引用的属性的所有属性名称的集合
container_names (set[str]) -- 此函数将更新的作为容器属性的属性的所有属性名称的集合
dataspecs (dict[str, PropertyDescriptor]) -- 此函数将更新的DataSpec属性的属性名映射到PropertyDescriptor
为特定类计算的默认值,忽略任何每个实例的主题化。
生成值,因为它应该序列化。
有时,序列化值与 __get__ 为了 __get__ 为方便用户或开发人员而简化。
obj (HasProps) -- 要获取其序列化属性的对象
类似JSON
obj -- (HasProps):要设置属性值的实例
json -- (JSON value):要设置为的属性的值
models (dict or None, optional) -- 模型ID到模型的映射(默认值:无)在要更新的属性也有引用的值的情况下,需要这样做。
对于容器属性,这通常是正确的, Instance 等。
Instance
只读属性只能由客户端修改(即,由BokehJS在浏览器中)。只读特性对于源于或只能在浏览器中计算的数量非常有用,例如,打印区域的“内部”打印标注(取决于当前布局状态)。Python回调能够知道这些值是很有用的,但只能在实际浏览器中计算它们。
UnitsSpecPropertyDescriptor
A PropertyDecscriptor 为了博克 UnitsSpec 有助于关联的属性 _units 属性自动作为副作用。
PropertyDecscriptor
UnitsSpec
_units
units_property (Property) -- 保存单位信息的关联属性
此方法首先分别提取和移除任何 units JSON中的字段,并直接设置关联的units属性。然后,剩余的JSON传递给超类 set_from_json 待处理。