Message 类

您可以使用 Message 类定义消息,以便在网络或进程空间中实现高效传输。Message 类使用 Field 类进行定义。

Messageprotorpc.messages 模块提供。

简介

Message 类所受限制要比普通类多,因为前者只能包含字段特性以及其他 Message 和 Enum 定义。实施这些限制的原因是,Message 类本身的结构旨在实现网络或进程空间传输,并由客户端、甚至其他服务器直接使用。同样,方法和非字段属性无法使用结构性信息进行传输,结构性信息会导致不同语言和实现之间产生冲突。

初始化和验证

如果某 Message 对象的所有必填字段均已填充值,并且所有嵌套消息也已进行初始化,则该对象被视为已初始化。

如果在 Message 对象未初始化的情况下调用“check_initialized”,则会引发 ValidationError;“is_initialized”会返回一个布尔值,指示该对象是否有效。

在创建和填充 Message 对象时,Google Protocol RPC 会自动验证这些对象。您的应用可以使用 Field 实例的 validate() 方法来验证给定值是否与其被分配给的字段兼容。用于消息时,此方法会检查消息及其子消息的所有值是否有效。如果向字段分配的值无效,则会引发 ValidationError

以下示例在虚拟股票交易应用中创建并初始化 Message 对象。

from protorpc import messages

# Trade type.
class TradeType(messages.Enum):
    BUY = 1
    SELL = 2
    SHORT = 3
    CALL = 4

class Lot(messages.Message):
    price = messages.IntegerField(1, required=True)
    quantity = messages.IntegerField(2, required=True)

class Order(messages.Message):
    symbol = messages.StringField(1, required=True)
    total_quantity = messages.IntegerField(2, required=True)
    trade_type = messages.EnumField(TradeType, 3, required=True)
    lots = messages.MessageField(Lot, 4, repeated=True)
    limit = messages.IntegerField(5)

order = Order(symbol='GOOG',
              total_quantity=10,
              trade_type=TradeType.BUY)

lot1 = Lot(price=304,
           quantity=7)

lot2 = Lot(price=305,
           quantity=3)

order.lots = [lot1, lot2]

# Now object is initialized!
order.check_initialized()

构造函数

Message 类的构造函数定义如下:

class Message(**kwargs)

初始化内部消息状态。

应用可以通过构造函数初始化消息,方法是传入与 Field 类相对应的关键字参数。例如:

class Date(Message)
    day = IntegerField(1)
    month = IntegerField(2)
    year = IntegerField(3)

定义 Field 类后,您可以精简的方式调用字段值。以下两个调用是等效的:

date = Date(day=6, month=6, year=1911)

等效于:

date = Date()
date.day = 6
date.month = 6
date.year = 1911

类方法

Message 类提供了以下类方法:

all_fields()
获取所有字段定义对象。返回一个按照任意顺序遍历所有值的迭代器。
field_by_name(name)
按名称获取字段。返回与名称关联的 Field 对象。
如果找不到具有该名称的字段,则引发 KeyError
field_by_number(number)
按编号获取字段。返回与该编号关联的 Field 对象。
如果找不到具有该编号的字段,则引发 KeyError

实例方法

Message 实例具有以下方法:

check_initialized()
检查所有必填字段是否已初始化。
如果 Message 对象未初始化,则引发 ValidationError
get_assigned_value(name)
获取分配的特性值。如果未设置该值,将返回 None。
参数:
name
要获取的特性的名称。

返回分配的属性值,如果未分配属性值,则返回 None。

is_initialized(name)
获取 Message 对象的初始化状态。如果消息是有效的,则返回 True,否则返回 False
reset(name)
重置分配的字段值,这将重建默认值;如果没有默认值,则返回 None。
参数:
name
要重置的字段的名称。