具有多态性的Python棉花糖树结构

2024-05-13 12:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下树结构的代码:

class Node:
    def __init__(self, node_id: str):
        self.node_id = node_id
        self.children = []

    def add_child(self, node: 'Node'):
        if isinstance(node, Node):
            self.children.append(node)


class ValueNode(Node):
    def __init__(self, value: bool, **kwargs):
        Node.__init__(self, **kwargs)
        self.value = value


class LogicNode(Node):
    def __init__(self, logic_operator: str, **kwargs):
        Node.__init__(self, **kwargs)
        self.logic_operator = logic_operator


a = Node("a")
b = LogicNode("or", node_id="b")
c = ValueNode(True, node_id="c")
d = ValueNode(False, node_id="d")

b.add_child(c)
b.add_child(d)
a.add_child(b)

如何将对象a序列化为json,然后再次序列化为python对象,同时保持正确的类型和树结构?在

我尝试了:

我试图将这个树结构序列化为json,以便通过API发送到ui。我找到了棉花糖,但不幸的是,我不知道该怎么做。我把它作为模式atm。在

^{pr2}$

这里的问题是,当序列化为json时,只有Node的属性存在,即使子节点是逻辑节点或值节点(应该有)。我发现了一个关于棉花糖的图案,但我无法使用它,因为我必须用它来代替:

# In NodeSchema
children = fields.Nested('self', many=True)

有:

class SomeNodeSchema(OneOfSchema):
    type_schemas = {
        'node': NodeSchema,
        'logic_node': LogicNodeSchema,
        'value_node': ValueNodeSchema,
    }

    def get_obj_type(self, obj):
        if isinstance(obj, LogicNode):
            return 'logic_node'
        if isinstance(obj, ValueNode):
            return 'value_node'
        elif isinstance(obj, Node):
            return 'node'

# In NodeSchema
children = fields.Nested(SomeNodeSchema, many=True)

但这就导致了循环导入,这就不可能了。在


Tags: selfaddidnodechildobjinitvalue
1条回答
网友
1楼 · 发布于 2024-05-13 12:27:49

I found about marshmallow-oneofschema

虽然没有整合到核心,我认为棉花糖oneofschema是做多态性的推荐方法。在

this leads to a circular import

您可以将名称作为字符串传递,以解决循环导入问题。

    children = fields.Nested('SomeNodeSchema', many=True)

相关问题 更多 >