我使用protorpc和端点-原始数据存储。
我想从提供的结构构建一个自定义消息。
例如,它是以下键列表:['id1', 'id2', 'id3']
每个键都分配给一个名为MessageField CustomField的密钥。
我想继承Message和一个包含所有key的类。
def create_custom_container(key_list):
class cls():
pass
for i, k in enumerate(key_list):
setattr(cls, k, MessageField(CustomField, i))
return cls
class CustomMessage(Message, create_custom_container(key_list)):
pass但这不管用,我得到了:MessageDefinitionError: Message types may only inherit from Message
我从protorpc源代码中看到,Message使用元类来防止它被继承或被动态修改。
所以,我不知道如何动态创建我的自定义消息。
发布于 2018-03-06 13:15:49
这个库很大程度上定义了消息类的约束--对它进行黑客攻击以强制使用新属性可能会导致消息不像预期的那样工作。
幸运的是,与其用class CustomMessage语句硬编码类主体,不如使用调用创建自定义类--这允许您以编程方式定义内容。这样,您就不需要在继承树上使用多个类。
您所要做的就是用适当的参数调用Message的元类,而不是通常对type的调用,并作为类命名空间传递-
因此,您可以重写您的身体创建函数,以便:
def create_custom_body(key_list):
dct = {}
for i, k in enumerate(key_list):
dct[k] = MessageField(CustomField, i)
return dct
CustomClass = Message.__class__("CustomClass", (Message,), create_custom_body(key_list))这在这种情况下是可行的。但是,如果库的元类使用自定义命名空间(即它有一个__prepare__方法),则需要修改它以使用types.new_class和适当的回调:
from types import new_class
def create_custom_body(dct, key_list):
for i, k in enumerate(key_list):
dct[k] = MessageField(CustomField, i)
return dct
CustomClass = types.new_class(
"CustomClass", (Message,),
exec_body=(lambda namespace: create_custom_body(namespace, key_list))
)https://stackoverflow.com/questions/49128861
复制相似问题