Python 2.7 已达到支持终止期限,并将于 2026 年 1 月 31 日
弃用。弃用后,您将无法部署 Python 2.7 应用,即使您的组织之前曾使用组织政策重新启用旧版运行时的部署也是如此。现有的 Python 2.7 应用在
弃用日期之后将继续运行并接收流量。我们建议您
迁移到最新支持的 Python 版本。
Message 类
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
您可以使用 Message 类定义消息,以便在网络或进程空间中实现高效传输。Message 类使用 Field 类进行定义。
Message
由 protorpc.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
- 要重置的字段的名称。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-20。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["很难理解","hardToUnderstand","thumb-down"],["信息或示例代码不正确","incorrectInformationOrSampleCode","thumb-down"],["没有我需要的信息/示例","missingTheInformationSamplesINeed","thumb-down"],["翻译问题","translationIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-08-20。"],[[["\u003cp\u003eThe \u003ccode\u003eMessage\u003c/code\u003e class defines structured messages for efficient data transmission across networks or processes, using field attributes, other \u003ccode\u003eMessage\u003c/code\u003e definitions, and \u003ccode\u003eEnum\u003c/code\u003e types.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eMessage\u003c/code\u003e objects must have all required fields populated and nested messages initialized to be considered valid, which can be checked with \u003ccode\u003echeck_initialized\u003c/code\u003e or \u003ccode\u003eis_initialized\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eMessage\u003c/code\u003e objects are validated upon creation and population, and assigning an invalid value will raise a \u003ccode\u003eValidationError\u003c/code\u003e, while the \u003ccode\u003evalidate()\u003c/code\u003e method can check value compatibility with a field.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eMessage\u003c/code\u003e constructor accepts keyword arguments corresponding to field classes, and values can be assigned directly during object creation or afterward, with the constructor supporting both methods.\u003c/p\u003e\n"],["\u003cp\u003eThe Message class offers class methods like \u003ccode\u003eall_fields\u003c/code\u003e, \u003ccode\u003efield_by_name\u003c/code\u003e, \u003ccode\u003efield_by_number\u003c/code\u003e to access field information, and instance methods such as \u003ccode\u003eget_assigned_value\u003c/code\u003e, and \u003ccode\u003ereset\u003c/code\u003e for handling field values.\u003c/p\u003e\n"]]],[],null,[]]