Python 在ATTR中,验证属性类型是否为封闭类
我想编写一个树Python 在ATTR中,验证属性类型是否为封闭类,python,python-3.x,tree,Python,Python 3.x,Tree,我想编写一个树Node类,其中包含Node子级,使用,并进行验证 由于节点尚不存在,因此无法编译以下内容- from attr import attrs, attrib from attr.validators import instance_of @attrs class Node: left = attrib(validator=instance_of(Node)) right = attrib(validator=instance_of(Node)) 有什么建议可以让我
Node
类,其中包含Node
子级,使用,并进行验证
由于节点
尚不存在,因此无法编译以下内容-
from attr import attrs, attrib
from attr.validators import instance_of
@attrs
class Node:
left = attrib(validator=instance_of(Node))
right = attrib(validator=instance_of(Node))
有什么建议可以让我达到我想要的行为吗
谢谢 您可以创建一个虚拟
节点
类(将此对象称为a),这样它就成为一个注册名称以避免名称错误
,然后您可以创建您的普通类,确保从虚拟类继承(将此对象称为B)
从技术上讲,对象A的名称已被覆盖,但仍保留对它的引用。因此,当您调用Node()
时,实际上是在处理对象B。这是对象A和对象B的类型,但在instance\u()中检查的类型严格来说是对象A。这对我们来说很好,但解释了为什么继承很重要
class Node:
pass
# This won't work because every `Node` we initialise will be strictly object B,
# but the validator requires a type of object A
@attrs
class Node:
left = ...
由于某些节点不可避免地必须是叶子,因此还必须允许左
和右
为非类型
。最后,提供默认值意味着您可以将节点初始化为node()
,而不是node(None,None)
。比如说,
>>> tree = Node(right=Node(Node()))
>>> tree
Node(left=None, right=Node(left=Node(left=None, right=None), right=None))
这不是一个解决方案,但是您是否也希望能够将属性设置为“无”?
>>> tree = Node(right=Node(Node()))
>>> tree
Node(left=None, right=Node(left=Node(left=None, right=None), right=None))