自定义事件
在客户端自定义事件之前,需要先在 DolphinDB 服务端定义事件。例如:如下 DolphinDB 脚本定义了1个事件类 TestEvent,该类具有3个属性。
class TestEvent {
a :: INT
b :: DECIMAL32(3)
c :: DOUBLE VECTOR
def TestEvent(a_, b_, c_) {
a = a_;
b = b_;
c = c_;
}
}
以上定义的事件为 CEP 引擎中要处理的事件。下例在 Python API 中继承 Event 类,定义一个与 TestEvent
具有同样结构的事件。
from dolphindb.cep import Event
from dolphindb.typing import Scalar, Vector
import dolphindb.settings as keys
class MyEvent(Event):
a: Scalar[keys.DT_INT]
b: Scalar[keys.DT_DECIMAL32, 3]
c: Vector[keys.DT_DOUBLE]
属性声明
使用 dolphindb.typing 中新增的 Scalar 和 Vector,可以声明属性的数据形式和数据类型。当前版本(3.0.0.0)仅支持标量和向量(tuple 和数组向量除外)两种数据形式。
标量
如果属性是一个标量,有2种声明方式:
Scalar[keys.DT_TYPE, (exparam)]
,其中,DT_TYPE 为 dolphindb.settings 中提供的数据类型常量,例如Scalar[keys.DT_INT]
,Scalar[keys.DT_STRING]
等;exparam 为 Decimal 类型特有参数,用于指定小数位数;例如Scalar[keys.DT_DECIMAL32, 3]
。Scalar[DATA_TYPE, (exparam)]
。其中,DATA_TYPE
为数据类型 ID,例如 Scalar[4],Scalar[37,3]。可在 DolphinDB 数据类型中查看各类型的 ID。
示例:
from dolphindb.settings as keys
class TestEvent(Event):
a: Scalar[keys.DT_INT] # 或 a: Scalar[4]
定义 Decimal 类型的标量,需要指定 exparam 参数。
class TestEvent(Event):
a: Scalar[keys.DT_DECIMAL32, 3] # 或 a: Scalar[37, 3]
向量
向量的声明方式和标量的方式类似:
Vecvtor[keys.DT_TYPE, (exparam)]
Vector[DATA_TYPE, (exparam)]
示例:
from dolphindb.settings as keys
class TestEvent(Event):
a: Vector[keys.DT_INT] # 或 a: Vector[4]
b: Vector[keys.DT_DECIMAL32, 3] # 或 b: Vector[37, 3]
构造函数
默认构造函数
继承自 Event 类的事件,具备默认构造函数,有两种构造实例的方式:使用位置参数构造和使用关键字构造。
以上文定义的 MyEvent 事件类型为例,分别介绍两种构造实例的方法。
使用位置参数构造
print(MyEvent(1, Decimal("1.234"), [1.1, 2.2]))
// output
MyEvent({'a': 1, 'b': Decimal('1.234'), 'c': [1.1, 2.2]})
使用关键字参数构造
print(MyEvent(a=1, b=Decimal("1.234"), c=[1.1, 2.2]))
// output
MyEvent({'a': 1, 'b': Decimal('1.234'), 'c': [1.1, 2.2]})
混合使用位置参数和关键字参数构造
print(MyEvent(1, Decimal("1.234"), c=[1.1, 2.2]))
// output
MyEvent({'a': 1, 'b': Decimal('1.234'), 'c': [1.1, 2.2]})
自定义构造函数
也可以通过重载构造函数的方式自定义构造函数行为,例如:
class MyEvent(Event):
...
def __init__(self):
self.a = 1
self.b = Decimal("1.234")
self.c = [1.1, 2.2]
print(MyEvent())
// output
MyEvent({'a': 1, 'b': Decimal('1.234'), 'c': [1.1, 2.2]})
事件名称
上例中定义的 MyEvent 事件类,其默认事件名称和类的名称相同,即 MyEvent。如果需要指定其它事件名称,可以在定义时指定
_event_name
属性,如下所示:
class MyEvent(Event):
_event_name = "TestName"
...
使用该方式重新定义了事件名称后,输出的事件名称为修改后的名称。
print(MyEvent(1, Decimal("1.234"), [1.1, 2.2]))
// output
TestName({'a': 1, 'b': Decimal('1.234'), 'c': [1.1, 2.2]})